2011-06-09 41 views
0

我有這個管道和dup使用的例子。它應該創建一個由管道連接的兩個進程的環。下面是代碼:使用管道的兩個進程的環

#include <unistd.h> 

#define READ 0 
#define WRITE 1 

main (int argc, char *argv[]) { 
int fd[2]; 
pipe(fd); //first call to pipe 
dup2(fd[READ],0); 
dup2(fd[WRITE],1); 
close(fd[READ]); 
close(fd[WRITE]); 
pipe(fd); //second call to pipe 

if (fork()==0) { 
    dup2(fd[WRITE],1); 
} else 
    dup2(fd[READ],0); 

close(fd[READ]); 
close(fd[WRITE]); 
} 

從「兩個過程的環」我明白,過程A的輸出被連接到處理B的輸入,並且處理B的輸出被連接到輸入的過程A.

第一次調用pipe之後,以及兩個suc2的連續調用,我認爲標準輸入和輸出被重定向到我的新管道的輸入和輸出。

然後,它來了第二次調用管道,讓我困惑,因爲我認爲它會覆蓋我以前的fd值。在這一點上,標準輸入和輸出是怎麼回事?

最後,叉電話:

沒有孩子重定向標準輸出管?

父母是否將標準輸入重定向到管道?

我看不到這裏的戒指。

我希望自己清楚,因爲我很困惑。

非常感謝!

回答

4

好吧,讓我們假裝你已經從終端開始了這件事。然後,你必須:

file 0 (stdin) = terminal keyboard 
file 1 (stdout) = terminal screen 
file 2 (stderr) = terminal screen 

現在你運行pipe(fd),你必須:

file 0-2 = as before 
file 3 (fd[0]) = read end of pipe 1 
file 4 (fd[1]) = write end of pipe 1 

現在你跑前兩個dup2 S和前兩個close S:

file 0 = read end of pipe 1 
file 1 = write end of pipe 1 
file 2 = still terminal screen 
file 3-4 = now closed 

現在你做一個新的pipe

file 0-2 as before 
file 3 (fd[0]) = read end of pipe 2 
file 4 (fd[1]) = write end of pipe 2 

現在你叉。在子進程調用dup2(fd[1],1)和關閉兩個fd S(源是不完全正確這裏):

file 0: read end of pipe 1 
file 1: write end of pipe 2 
file 2: terminal screen 
file 3-4: closed 

在你打電話dup2(fd[0],0)父進程,並再次關閉兩個fd小號給它:

file 0: read end of pipe 2 
file 1: write end of pipe 1 
file 2: terminal screen 
file 3-4: closed 

所以我們有父進程寫它的標準輸出到管道1,孩子讀取它的標準輸入。同樣,我們有父進程從管道2讀取它的stdin,這個孩子正在寫它的stdout。即,兩個過程的一環。

我總是被教導,這種安排容易發生死鎖。我不知道更現代的Unix是否是這樣,但值得一提的是。

+0

優秀的解釋!非常感謝你! – 2011-06-09 11:30:07

相關問題