下面程序演示了在嵌入式Linux和PC機Linux下使用popen函數時,程序的運行結果是有差別的。函數
兩個程序 atest.c 和 btest.c,atest 檢查是否有 btest 進程運行,若是沒有就執行 btest 而後退出,若是有就直接退出。atest在檢查時輸出 btest 進程數,PC機是buf 值,但嵌入式是buf值減1,爲何?後面說明。spa
atest.c 源代碼:.net
#include <stdio.h> #include <sys/time.h> static int IsExistent(const char * name) { int ret = 0; FILE *strm; char buf[128]; sprintf(buf,"ps | grep -c %s", name); if((strm=popen(buf, "r")) != NULL) { if(fgets(buf, sizeof(buf), strm) != NULL) { ret = atoi(buf) > 1 ? 1 : 0; printf("IsExistent, buf = %s, ret = %d\n", buf, ret); } pclose(strm); } return ret; } static void Execute(const char * name) { char buf[128]; sprintf(buf, "./%s &", name); printf("Execute, buf = %s\n", buf); system(buf); return; } int main() { if(0 == IsExistent("btest")) { printf("no btest process.\n"); Execute("btest"); }else { printf("btest process exists.\n"); } return 0; }
btest.c 源代碼:設計
#include<stdio.h> int main() { while(1) { printf("running...\n"); sleep(3); } return 0; }
PC機Linux上的運行結果:3d
嵌入式Linux上的運行結果:code
爲何在嵌入式系統上出現buf等於3的狀況?先說說前面提到的「嵌入式是buf值減1」的緣由。blog
若是 atest 中的 IsExistent 函數這樣實現:進程
static int IsExistent(const char * name)
{
char buf[128];
sprintf(buf,"ps | grep \"%s\"", name);
system(buf);
return 0;
} get
修改後的atest代碼:string
#include <stdio.h> #include <string.h> #include <sys/time.h> static int IsExistent(const char * name) { int ret = 0; FILE *strm; char buf[128]; //[]sprintf(buf,"ps | grep \"%s\" | grep -cv \"grep\"", name); sprintf(buf,"ps | grep \"%s\"", name); //[] system(buf); //[] return 0; //[] if((strm=popen(buf, "r")) != NULL) { if(fgets(buf, sizeof(buf), strm) != NULL) { ret = atoi(buf) > 0 ? 1 : 0; printf("IsExistent, buf = %s, ret = %d\n", buf, ret); } pclose(strm); } return ret; } static void Execute(const char * name) { char buf[128]; sprintf(buf, "./%s &", name); printf("Execute, buf = %s\n", buf); system(buf); return; } int main() { if(0 == IsExistent("btest")) { //[] printf("no btest process.\n"); //[] Execute("btest"); }else { //[] printf("btest process exists.\n"); } return 0; }
在嵌入式系統中運行,結果顯示連 「 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 = 0; FILE *strm; char buf[128]; 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) > 0 ? 1 : 0; printf("IsExistent, buf = %s, ret = %d\n", buf, ret); } pclose(strm); } return ret; } static void Execute(const char * name) { char buf[128]; sprintf(buf, "./%s &", name); printf("Execute, buf = %s\n", buf); system(buf); return; } int main() { if(0 == IsExistent("btest")) { printf("no btest process.\n"); Execute("btest"); }else { printf("btest process exists.\n"); } return 0; }
是嵌入式Linux的BUG呢,仍是有意這麼設計的? 請知道的在下面留言說一說,謝謝~~~
原連接:https://blog.csdn.net/iw1210/article/details/47778247