2016-02-29 85 views
1

我正在研究一個小程序,它使用管道和文件描述符獲取familliar,並花費大量時間調試無意義的問題。程序更改的行爲取決於調用fork的位置

我花了很多時間思考我誤解了文件描述符,當它只是程序行爲的不同取決於我在哪裏使用fork。

int main(void) 
{ 
int fid; 
int p[2]; 
pipe(p); 
char buf[20]; 

fid = fork(); 
if (fid==0){ 
    close(p[1]); 
    dup2(p[0],0); 
    close(p[0]); 
    execlp("cat","cat",(char *)NULL); 

} 
else{ 
    close(p[0]); 
    dup2(p[1],1); 
    close(p[1]); 
    execlp("ls","ls",(char *)NULL); 
} 

return 0; 
} 

給我該目錄中什麼的預期輸出。我把輸出放到貓身上。

如果我將叉子移動到管道(p)上方;我不會得到任何輸出。我不明白爲什麼會發生這種情況?

回答

1

所以,你想知道爲什麼這個工程:

pipe(p); 
fid = fork(); 

,這並不:

fid = fork(); 
pipe(p); 

原因很簡單:在第一種情況下,該過程創建一個管道,然後分成兩個(這兩個進程都可以訪問管道)。

在第二種情況下,進程分成兩部分,然後兩個進程中的每一個創建與另一個進程無關的自己的管道。

所以在第一種情況下,一個進程寫入管道,另一個進程從中讀取。在第二種情況下,一個進程寫入管道,另一個進程從讀取另一個管道,由於它是不同的管道,顯然還未收到數據。

0

系統調用fork創建調用它的過程的確切副本。這包括任何文件描述符。通過fork調用,每個進程都有通過您的pipe調用創建的管道末端。這就是爲什麼每個過程關閉管道的另一端,然後一個過程調用dup2將管道掛接到stdout,而另一個過程將管道掛接到stdin。這就是過程交流的方式。但是如果在調用pipe之前調用fork,則每個進程都創建了自己的獨立管道。

相關問題