下面程序演示了在嵌入式Linux和PC机Linux下使用popen函数时,程序的运行结果是有差异的。

两个程序 atest.c 和 btest.c,atest 检查是否有 btest 进程运行,如果没有就执行 btest 然后退出,如果有就直接退出。atest在检查时输出 btest 进程数,PC机是buf 值,但嵌入式是buf值减1,为什么?后面说明。

atest.c 源代码:

#include <stdio.h>
#include <sys/time.h> static int IsExistent(const char * name)
{
int ret = ; FILE *strm;
char buf[]; sprintf(buf,"ps | grep -c %s", name); if((strm=popen(buf, "r")) != NULL)
{
if(fgets(buf, sizeof(buf), strm) != NULL)
{
ret = atoi(buf) > ? : ;
printf("IsExistent, buf = %s, ret = %d\n", buf, ret);
}
pclose(strm);
} return ret;
} static void Execute(const char * name)
{
char buf[];
sprintf(buf, "./%s &", name);
printf("Execute, buf = %s\n", buf);
system(buf);
return;
} int main()
{
if( == IsExistent("btest"))
{
printf("no btest process.\n");
Execute("btest");
}else
{
printf("btest process exists.\n");
} return ;
}

btest.c 源代码:

#include<stdio.h>

int  main()
{
while()
{
printf("running...\n");
sleep();
} return ;
}

PC机Linux上的运行结果:

嵌入式Linux上的运行结果:

为什么在嵌入式系统上出现buf等于3的情况?先说说前面提到的“嵌入式是buf值减1”的原因。

如果 atest 中的 IsExistent 函数这样实现:

static int IsExistent(const char * name)  
{  
        char buf[128];  
        sprintf(buf,"ps | grep \"%s\"", name);  
        system(buf); 
        return 0;   
}

修改后的atest代码:

#include <stdio.h>
#include <string.h>
#include <sys/time.h> static int IsExistent(const char * name)
{
int ret = ; FILE *strm;
char buf[]; //[]sprintf(buf,"ps | grep \"%s\" | grep -cv \"grep\"", name);
sprintf(buf,"ps | grep \"%s\"", name); //[]
system(buf); //[]
return ; //[] if((strm=popen(buf, "r")) != NULL)
{
if(fgets(buf, sizeof(buf), strm) != NULL)
{
ret = atoi(buf) > ? : ;
printf("IsExistent, buf = %s, ret = %d\n", buf, ret);
}
pclose(strm);
} return ret;
} static void Execute(const char * name)
{
char buf[];
sprintf(buf, "./%s &", name);
printf("Execute, buf = %s\n", buf);
system(buf);
return;
} int main()
{
if( == IsExistent("btest"))
{
//[] printf("no btest process.\n");
//[] Execute("btest");
}else
{
//[] printf("btest process exists.\n");
} return ;
}

在嵌入式系统中运行,结果显示连 “ ps | grep "btest" ”命令也算入其中了,甚至还出现两条的情况,怎么回事?也许这是个BUG。截图:

把 IsExistent 函数中的命令 buf 如下赋值:

sprintf(buf,"ps | grep \"%s\" | grep -cv \"grep\"", name);

即再加一个 grep 命令,把含有“grep”单词的行去掉,结果就正常了。

修改后的atest代码:

#include <stdio.h>
#include <string.h>
#include <sys/time.h> static int IsExistent(const char * name)
{
int ret = ; FILE *strm;
char buf[]; sprintf(buf,"ps | grep \"%s\" | grep -cv \"grep\"", name); if((strm=popen(buf, "r")) != NULL)
{
if(fgets(buf, sizeof(buf), strm) != NULL)
{
ret = atoi(buf) > ? : ;
printf("IsExistent, buf = %s, ret = %d\n", buf, ret);
}
pclose(strm);
} return ret;
} static void Execute(const char * name)
{
char buf[];
sprintf(buf, "./%s &", name);
printf("Execute, buf = %s\n", buf);
system(buf);
return;
} int main()
{
if( == IsExistent("btest"))
{
printf("no btest process.\n");
Execute("btest");
}else
{
printf("btest process exists.\n");
} return ;
}

是嵌入式Linux的BUG呢,还是有意这么设计的? 请知道的在下面留言说一说,谢谢~~~

原链接:https://blog.csdn.net/iw1210/article/details/47778247

【转】在嵌入式Linux和PC机Linux下使用popen函数时,程序运行结果有差异。的更多相关文章

  1. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...

  2. 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...

  3. 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...

  4. 嵌入式linux和pc机的linux对照

    linux本身具备的非常大长处就是稳定,内核精悍,执行时须要的资源少.嵌入式linux和普通linux并无本质差别. 在嵌入式系统上执行linux的一个缺点就是其核心架构没有又一次设计过,而是直接从桌 ...

  5. Delphi - 让Delphi10.2在Windows下开发的图形界面程序运行在64位Linux中!

    FmxLinux官网:https://fmxlinux.com/ 参考: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Linux_Applica ...

  6. linux(ubuntu) 搭建java程序运行环境

    一:简介 ubuntu 系统的和linux差不多,我们需要在系统上搭建java程序运行环境,需要安装jdk,mysql这两个软件,tomcat是绿色版,直接通过taz -zxvf tomcat 就可以 ...

  7. system(linux) power on note

    读詹荣开文档摘 BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader Boot Loader执行全 ...

  8. 认识Linux瘦客户机

           (本文完整版见http://os.51cto.com/art/201001/181448.htm)        随着Linux的发展,以及网络计算技术的发展和逐步深入的云计算,基于Li ...

  9. 嵌入式Linux开发教程:Linux常见命令(上篇)

    摘要:这是对周立功编著的<嵌入式Linux开发教程>的第7期连载.本期刊载内容有关LinuxLinux常见命令中的导航命令.目录命令和文件命令.下一期将连载网络操作命令.安装卸载文件系统等 ...

随机推荐

  1. 桥接模式(Bridge)

    1.概念 桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化,属于结构性模式的一种. 2.模式结构 Abstraction(抽象类):定义抽象接口,拥有一个Implementor类型的对象引 ...

  2. CSS 关于屏幕适配REM

    这里不多说了,想详细了解的可以参考 2350305682 的博客 https://www.cnblogs.com/annie211/p/8118857.html 不想多深究,想先实现的看这(移动端): ...

  3. windows 公司内部搭建禅道(项目管控)

    禅道的搭建异常爽快,非常方便,一般情况下我们使用开源版就可以了.下面是搭建流程,这里主要记录一些前期的注意事项 使用一键安装版就可以,很快,禅道安装主机安装好所需的Apache容器和mysql数据库, ...

  4. MySQL入门详解(三)---mysql如何进行主从配置

    基本要求 两台服务器(windows,linux,mac) 双方mysql版本需一致,如不一致,只要主节点低于从节点 两台服务器防火墙关闭 双方数据库所用的用户,要具有远程访问的权限 主服务器配置 修 ...

  5. v-charts使用心得

    前端er经常都会遇到使用echarts的时候,特别是弄后台管理的报表等地方,而v-charts是echarts的vue版本(饿了么写的),基本上能应付普通的图表.传送门 隐藏提示框与图例 v-char ...

  6. 让一个小div在另一个大div里面 垂直居中的四种方法

    方法一 .parent { width:800px; height:500px; border:2px solid #000; position:relative; } .child { width: ...

  7. JS获取填报扩展单元格控件的值

    1. 问题描述 填报预览时,我们想获取到某个控件的值相对来说较容易.但如果控件是扩展的,就只能获取到第一个值,无法根据扩展一行行获取对应的值. 例:本意是想获取到袁成洁,结果还是获取到第一个单元格值孙 ...

  8. Win7/8/10十个最强大通用快捷键

    Windows 操作系统功能丰富,可视化的界面能够帮助我们提高工作效率.不过,日常使用中,很多用户都习惯“一只鼠标走天下”,频繁的点击让手指疲惫不堪. 为此,我们总结了十个适用于 Windows 7 ...

  9. css实现3D立方体旋转特效

    先来看运行后出来的效果 它是在不停运行的一个立方体 先来看html部分的代码 <div class="rect-wrap"> <!--舞台元素,设置perspec ...

  10. 关于TCP/IOCP构架中出现的假死连接解决方案

    如果在2台不同的公网机器,对TCP的c/s做过详细的压力测试,那么很不幸,会有很多人发现自己的server端会出现大量的假死连接. 假死连接具体表现如下: 1.在s端机器上,会有一些处于TCP_EST ...