[apue] 使用 popen/pclose 的一點疑問

當咱們須要將輸出做爲標準輸入傳遞給一個命令,或者將一個命令的輸出做爲標準輸入來讀取,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命名管道,可是在父進程中卻找不到相應的管道,這是怎麼回事呢……

 

這個疑問已有解答,請移步:

[apue] popen/pclose 疑點解惑

相關文章
相關標籤/搜索