【轉】在嵌入式Linux和PC機Linux下使用popen函數時,程序運行結果有差別。

下面程序演示了在嵌入式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

相關文章
相關標籤/搜索