popen函式代替system函式
阿新 • • 發佈:2019-02-01
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
fp = popen("cat tmp1.txt 2>&1", "r"); //tmp1.txt在檔案中並不存在
fgets(buf, 1024, fp);
printf("buf: %s\n", buf);
執行:
這樣就可以拿到命令正確執行和執行出錯的結果了。