2016-09-30 44 views
0

我一直想創建一個子進程,兩次分叉創建兩個子進程。輸出一個,發送給另一個。 我找到了這個示例代碼。但我很困惑它是如何工作的。這個例子如何使用dup工作?

我找到了example here。但是,我對dup的使用方式以及它的工作原理感到困惑。

close(1); 
dup(fd[1]); 
close(fd[0]); 
close(fd[1]); 

輸出然後用管道輸送到第二叉形的過程,它的配管連接是這樣的:

close(0); 
dup(fd[0]); 
close(fd[0]); 
close(fd[1]); 
+1

是的,它確實如此。 'close(1); dup(fd [1]);'序列等同於'dup2(fd [1],1):'。 –

回答

2

主要相關線路是這些 - 它們形成一個標準的習慣用法(但用dup2(fd[1], 1)替換前兩行更容易):

close(1); 
dup(fd[1]); 
close(fd[0]); 
close(fd[1]); 

dup()函數將其參數文件描述符複製到編號最小的未打開文件描述符。 close()關閉描述符1,描述符0仍然打開,所以dup()使標準輸出1指的是管道fd[1]的寫入端。其他兩個關閉呼叫正確關閉管道的兩端。該過程不應該從管道的讀取端讀取fd[0],並且標準輸出正在寫入管道的寫入端,因此其他描述符不再需要(如果未關閉,可能會導致問題)。

因此,這是將管道的寫入端連接到進程的標準輸出的標準序列。第二個序列是相似的,但將管道的讀取端連接到標準輸入(而不是寫入結束到標準輸出)。

通常,當您將管道的一端連接到標準輸入或標準輸出時,該過程應關閉兩個兩端的原始管道。

我注意到沒有錯誤檢查,儘管不太可能會出現任何問題 - 除非進程已經以標準輸出或標準輸入關閉,與所有合理的預期相反。