2011-10-23 39 views
5

我的主要過程是分叉兩次,從而創建兩個孩子。這兩個孩子是這樣彼此管道:最後一個分叉的孩子不會死亡

ls | more 

現在的問題是,第二個孩子永遠不會死。這是爲什麼?什麼時候管道中的最後一個孩子真的死了?

刪除一個wait()調用顯示ls | more的預期結果,但給出了一些更奇怪的行爲(卡住終端等)。

這裏是我的代碼:

int main(){ 
    printf("[%d] main\n", getpid()); 
    int pip[2], i; 
    pipe(pip); 

    /* CHILDREN*/ 
    for (i=0; i<2; i++){ 
    if (fork()==0){ 

     /* First child */ 
     if (i==0){ 
     printf("[%d] child1\n", getpid()); 
     close(1); dup(pip[1]); 
     close(pip[0]); 
     execlp("ls", "ls", NULL);} 

     /* Second child */ 
     if (i==1){ 
     printf("[%d] child2\n", getpid()); 
     close(0); dup(pip[0]); 
     close(pip[1]); 
     execlp("more", "more", NULL);} 
    } 
    } 
    wait(NULL); // wait for first child 
    wait(NULL); // wait for second child 
    return 0; 
} 
+1

這個問題的標題聽起來非常暴力。 – Marlon

+0

@Marlon哈哈直到現在都沒有看到它那樣! – Pithikos

回答

6

管道的閱讀到底會不會得到一個EOF標記直到寫入結束被所有用戶關閉。兩個孩子的父母仍然打開管道的兩端,因此more未看到EOF(從read()返回0),並且一直等待更多輸入。

+0

謝謝,這是它! – Pithikos

0

檢查與ps axw它真的是不會死的more。然後閱讀wait的手冊頁。查看wait的退貨狀態。

(提示:看是什麼原因導致了「殭屍」過程中,我不認爲等待在做什麼,你認爲他們是。)

+0

與「ps aux | grep more」也做到了這一點。我可以看到第二個孩子活着,提示符掛起(等待孩子)。 – Pithikos