1. 程式人生 > >Linux C語言呼叫system命令並獲取命令的返回值

Linux C語言呼叫system命令並獲取命令的返回值

思路:popen開啟,命令執行完後,對fp進行讀取,讀到output引數裡面。
注意:size不要太大。一般64,128夠用。用1024或者4028,會出現段錯誤,棧報錯。
popen()可以執行shell命令,並讀取此命令的返回值;  
popen()函式通過建立一個管道,呼叫fork()產生一個子程序,執行一個shell以執行命令來開啟一個程序。可以通過這個管道執行標準輸入輸出操作。這個管道必須由pclose()函式關閉,而不是fclose()函式(若使用fclose則會產生殭屍程序)。
pclose()函式關閉標準I/O流,等待命令執行結束,然後返回shell的終止狀態。
如果shell不能被執行,則pclose()返回的終止狀態與shell已執行exit一樣。

static int get_system_output(char *cmd, char *output, int size)
{
    FILE *fp=NULL;  
    fp = popen(cmd, "r");   
    if (fp)
    {       
        if(fgets(output, size, fp) != NULL)
        {       
            if(output[strlen(output)-1] == '\n')            
                output[strlen(output)-1
] = '\0'; } pclose(fp); } return 0; }
    memset( &cmd, 0x00, sizeof(cmd));
    snprintf(cmd, sizeof(cmd), "grep \"%s\" %s | cut -d ' ' -f 1", client_mac, net_arp_file);
    my_printf(LOG_MODE_LEVEL_1, "[##lin##]%s(%d) cmd:%s\n",__FUNCTION__,__LINE__, cmd);
    get_system_output(cmd, client_online_tmp, 64
); my_printf(LOG_MODE_LEVEL_1, "[##lin##]%s(%d) client_online_tmp:%s\n",__FUNCTION__,__LINE__, client_online_tmp);