在unix中pipe是一種很早的進程間通訊的手段,主要用於有血緣關係的進程(例如父子進程等)。pipe是半雙工的,即數據流的方向是單向的。關於pipe的內容在unp的pipe和fifo章節進行總結吧,本文主要分析popen函數。
標準I/O庫提供了popen函數,原型如下:
FILE *popen(const char *cmd, const char *type);
int pclose(FILE *stream);
其中cmd是一個shell命令行,當調用popen函數時,會創建一個pipe,這個pipe會用在調用進程和cmd shell命令之間進行通訊。popen的返回值是標準I/O的FILE結構,可以用於輸入或者輸出,具體是輸入還是輸出由type參數決定:
1、如果type=r,則調用進程從cmd的標準輸出中讀內容,即讀取的內容是cmd輸出的內容
用圖表示如下:
2、如果type=w,則調用進程將內容寫到cmd命令的標準輸入中,作爲cmd命令的標準輸入
那麼popen函數是如何實現的呢?APUE給出了一個版本,google code下搜了一個,如下所示:
當然,上面只是其中的一種實現方式而已,但整體的實現思路是類似的。
參考:google code popen實現、APUE popen實現