[apue] 使用 popen/pclose 的一點(diǎn)疑問(wèn)
當(dāng)我們需要將輸出作為標(biāo)準(zhǔn)輸入傳遞給一個(gè)命令,或者將一個(gè)命令的輸出作為標(biāo)準(zhǔn)輸入來(lái)讀取,
一般會(huì)想到使用pipe與fork相結(jié)合的方式,來(lái)重定向標(biāo)準(zhǔn)輸入/輸出給指定命令。
popen/pclose 幫助我們簡(jiǎn)化了上述工作,只需要調(diào)用:
FILE* fpout = popen("more", "w");
就可以將輸出寫(xiě)入more命令。只需要調(diào)用:
FILE* fpin = popen("ls -l .", "r");
就可以從輸入讀取ls命令的輸出內(nèi)容。
apue上有一段是這樣說(shuō)明 popen 內(nèi)部的工作原理的:
“這兩個(gè)函數(shù)實(shí)現(xiàn)的操作是:創(chuàng)建一個(gè)管道,調(diào)用fork產(chǎn)生一個(gè)子進(jìn)程,關(guān)閉管道的不使用端,
執(zhí)行一個(gè)shell以運(yùn)行命令,然后等待命令終止。”
寫(xiě)了一個(gè)程序驗(yàn)證一下:
程序運(yùn)行后,使用另一個(gè)命令窗口查看進(jìn)程ID:

分別對(duì)23153與23154調(diào)用lsof查看管道信息:

可以看到在子進(jìn)程more中確實(shí)有名為pipe的FIFO命名管道,但是在父進(jìn)程中卻找不到相應(yīng)的管道,這是怎么回事呢……
本文來(lái)自博客園,作者:goodcitizen,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/goodcitizen/p/popen_pclose_problem.html
浙公網(wǎng)安備 33010602011771號(hào)