標準i/o函式庫提供了popen函式,它啟動另外乙個程序去執行乙個shell命令列。
這裡我們稱呼叫popen的程序為父程序,由popen啟動的程序稱為子程序。
popen函式還建立乙個管道用於父子程序間通訊。子程序要麼從管道讀資訊,要麼向管道寫資訊,至於是讀還是寫取決於父程序呼叫popen時傳遞的引數。下在給出popen、pclose的定義:
view source
print?
01 #include
02 09
file * popen( const char * command,const char * type);
10 11
15 int pclose(file * stream);
下面通過例子看下popen的使用:
假如我們想取得當前目錄下的檔案個數,在shell下我們可以使用:
1 ls | wc -l
我們可以在程式中這樣寫:
01 02
#include
03 #include
04 #include
05 #include
06 07
#define maxline 1024
08 09
int main()
10
25 while(fgets(result_buf, sizeof(result_buf), fp) != null)
26
32 printf("命令【%s】 輸出【%s】\r\n", command, result_buf);
33 }
34 35
36 rc = pclose(fp);
37 if(-1 == rc)
38
42 else
43
46 47
return 0;
48 }
編譯並執行:
$ gcc popen.c
$ ./a.out
命令【ls ./ | wc -l】 輸出
命令【ls ./ | wc -l】子程序結束狀態命令返回值
上面popen只捕獲了command的標準輸出,如果command執行失敗,子程序會把錯誤資訊列印到標準錯誤輸出,父程序就無法獲取。比 如,command命令為「ls nofile.txt」 ,事實上我們根本沒有nofile.txt這個檔案,這時shell會輸出「ls: nofile.txt: no such file or directory」。這個輸出是在標準錯誤輸出上的。通過上面的程式並無法獲取。
注:如果你把上面程式中的command設成「ls nofile.txt」,編譯執行程式你會看到如下結果:
$ gcc popen.c
$ ./a.out
ls: nofile.txt: no such file or directory
命令【ls nofile.txt】子程序結束狀態命令返回值
需要注意的是第一行輸出並不是父程序的輸出,而是子程序的標準錯誤輸出。
有時子程序的錯誤資訊是很有用的,那麼父程序怎麼才能獲取子程序的錯誤資訊呢?
這裡我們可以重定向子程序的錯誤輸出,讓錯誤輸出重定向到標準輸出(2>&1),這樣父程序就可以捕獲子程序的錯誤資訊了。例如command為「ls nofile.txt 2>&1」,輸出如下:
命令【ls nofile.txt 2>&1】 輸出【ls: nofile.txt: no such file or directory】
命令【ls nofile.txt 2>&1】子程序結束狀態命令返回值
附:子程序的終止狀態判斷涉及到的巨集,設程序終止狀態為status.
wifexited(status)如果子程序正常結束則為非0值。
wexitstatus(status)取得子程序exit()返回的結束**,一般會先用wifexited 來判斷是否正常結束才能使用此巨集。
wifsignaled(status)如果子程序是因為訊號而結束則此巨集值為真。
wtermsig(status)取得子程序因訊號而中止的訊號**,一般會先用wifsignaled 來判斷後才使用此巨集。
wifstopped(status)如果子程序處於暫停執**況則此巨集值為真。一般只有使用wuntraced 時才會有此情況。
wstopsig(status)取得引發子程序暫停的訊號**,一般會先用wifstopped 來判斷後才使用此巨集。
基於管道的popen和pclose函式
標準i o函式庫提供了popen函式,它啟動另外乙個程序去執行乙個shell命令列。這裡我們稱呼叫popen的程序為父程序,由popen啟動的程序稱為子程序。popen函式還建立乙個管道用於父子程序間通訊。子程序要麼從管道讀資訊,要麼向管道寫資訊,至於是讀還是寫取決於父程序呼叫popen時傳遞的引數...
基於管道的popen和pclose函式
標準i o函式庫提供了popen函式,它啟動另外乙個程序去執行乙個shell命令列。這裡我們稱呼叫popen的程序為父程序,由popen啟動的程序稱為子程序。popen函式還建立乙個管道用於父子程序間通訊。子程序要麼從管道讀資訊,要麼向管道寫資訊,至於是讀還是寫取決於父程序呼叫popen時傳遞的引數...
基於管道的popen和pclose函式
標準i o函式庫提供了popen函式,它啟動另外乙個程序去執行乙個shell命令列。這裡我們稱呼叫popen的程序為父程序,由popen啟動的程序稱為子程序。popen函式還建立乙個管道用於父子程序間通訊。父程序要麼從管道讀資訊,要麼向管道寫資訊,至於是讀還是寫取決於父程序呼叫popen時傳遞的引數...