當咱們須要將輸出做爲標準輸入傳遞給一個命令,或者將一個命令的輸出做爲標準輸入來讀取,html
通常會想到使用pipe與fork相結合的方式,來重定向標準輸入/輸出給指定命令。git
popen/pclose 幫助咱們簡化了上述工做,只須要調用:github
FILE* fpout = popen("more", "w");shell
就能夠將輸出寫入more命令。只須要調用:函數
FILE* fpin = popen("ls -l .", "r");測試
就能夠從輸入讀取ls命令的輸出內容。htm
apue上有一段是這樣說明 popen 內部的工做原理的:blog
「這兩個函數實現的操做是:建立一個管道,調用fork產生一個子進程,關閉管道的不使用端,進程
執行一個shell以運行命令,而後等待命令終止。」ip
寫了一個程序驗證一下:
程序運行後,使用另外一個命令窗口查看進程ID:
分別對23153與23154調用lsof查看管道信息:
能夠看到在子進程more中確實有名爲pipe的FIFO命名管道,可是在父進程中卻找不到相應的管道,這是怎麼回事呢……
這個疑問已有解答,請移步: