基於管道的popen和pclose函式

2021-06-16 11:41:56 字數 2193 閱讀 3150

標準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時傳遞的引數...