1. 程式人生 > >popen函式代替system函式

popen函式代替system函式

system()函式的原型為:

int system(const char *command);

函式的返回值表示system()函式呼叫的執行結果,成功返回0,失敗返回-1並設定errno為錯誤程式碼。需要注意的是該函式並不能獲取command命令的執行結果。

tmp.txt的內容為:

helloworld
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(void)
{
    int ret = system("cat tmp1.txt");   //不存在tmp1.txt
if (ret < 0) perror("system"); system("cat tmp.txt"); if (ret < 0) perror("system"); return 0; }

執行:
這裡寫圖片描述

要想在程式碼中獲取command命令的執行結果,可以通過popen函式:

int main(void)
{
    FILE* fp = NULL;
    char buf[1024] = {'\0'};
    fp = popen("cat tmp.txt", "r");
    fgets(buf, 1024
, fp); printf("buf: %s\n", buf); pclose(fp); return 0; }

執行:
這裡寫圖片描述
可見popen()函式是將標準輸出重定位到fp中,然後通過讀取fp就可以獲取command命令執行的輸出結果。需要注意,command命令若執行失敗,其錯誤資訊從標準錯誤輸出,所以不能通過fp指標獲取錯誤輸出結果。

fp = popen("cat tmp1.txt", "r");    //tmp1.txt在檔案中並不存在
fgets(buf, 1024, fp);
printf("buf: %s\n", buf);

執行:
這裡寫圖片描述
解決辦法是在command

中將標準錯誤輸出重定向到標準輸出中,即命令上加上”2>&1

fp = popen("cat tmp1.txt 2>&1", "r");   //tmp1.txt在檔案中並不存在
fgets(buf, 1024, fp);
printf("buf: %s\n", buf);

執行:
這裡寫圖片描述
這樣就可以拿到命令正確執行和執行出錯的結果了。