下面程序演示了在嵌入式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. Java - Thread 和 Runnable实现多线程

    Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式 概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过jav ...

  2. Hanoi问题 算法

    问题描述:假设有3个分别命名为A.B.C的塔座,在塔座A上插有n个直径大小各不同,一小到大标号为1,2,….,n的圆盘,要求将塔座A上的n个圆盘移动到C盘上,并且仍按原来的顺序叠排. 同时遵循下列规则 ...

  3. POJ3281(KB11-B 最大流)

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19170   Accepted: 8554 Descripti ...

  4. python学习之老男孩python全栈第九期_day009之文件操作总结

    # 文件处理# 打开文件# open('路径','打开方式', '指定编码方式')# 打开方式:r w a 可读可写:r+ 可写可读:w+ 可追加可读:a+ b# r+ :打开文件直接写,和读完再写 ...

  5. vue2.0父子组件通信的方法

    vue2.0组件通信方法:props传值和emit监听.(.sync方法已经移除.详情请点击)(dispatch-和-broadcast方法也已经废弃) props方法传值:Props 现在只能单项传 ...

  6. 洛谷P3586 [POI2015]LOG(贪心 权值线段树)

    题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...

  7. js-ES6学习笔记-async函数(2)

    1.async函数返回一个 Promise 对象. async函数内部return语句返回的值,会成为then方法回调函数的参数. async function f() { return 'hello ...

  8. jquery插件-fullpage.js

    1⃣️ 简介 fullPage.js 是一个基于 jQuery 的插件,它能够很方便.很轻松的制作出全屏网站,主要功能有: 支持鼠标滚动 支持前进后退和键盘控制 多个回调函数 支持手机.平板触摸事件 ...

  9. 大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)

       前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分 ...

  10. 11.@RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: handler method ...