2014-10-29 46 views
1

任何人都可以請解釋爲什麼輸出是這樣的?我對這些過程如何執行(以何種順序?)以及關於waitpid()/wait()非常困惑。 下面是代碼:wait()在Linux中如何工作?

#include<stdio.h> 
main() 
{ 
    int pid1, pid2, pid3; 
    pid1=fork(); 
    if(pid1 == 0){ 
     printf("PID of child 1 is :%d\n",getpid()); 
     //sleep(2); 
    } 
    pid2=fork(); 
    if(pid2 == 0){ 
     printf("PID of child 2 is :%d\n",getpid()); 
     //sleep(2); 
    } 
    pid3=fork(); 
    if(pid3 == 0){ 
     printf("PID of child 3 is :%d\n",getpid()); 
     //sleep(2); 
    } 
    else{ 
     printf("PID of parent is :%d\n",getpid()); 
     waitpid(pid1,0,0); 
     waitpid(pid2,0,0); 
     waitpid(pid3,0,0); 
    } 
} 

實際輸出:

PID of child 1 is :4963 

PID of parent is :4962 

PID of parent is :4963 

PID of child 2 is :4966 

PID of parent is :4966 

PID of child 2 is :4964 

PID of parent is :4964 

PID of child 3 is :4967 

PID of child 3 is :4965 

PID of child 3 is :4969 

PID of child 3 is :4968 

預期輸出:

  1. PID父母因爲PID1不爲0,永不0這裏。

  2. 然後等待,直到PID1即child1被終止並打印PID孩子1

  3. 。然後現在的child2,所以他們被跳過

  4. 話又說回來父的PID child3還沒有分叉,PID child1,的child2

    的PID的
  5. 然後父母,child1的PID,和的child2的child3 PID的PID的PID。

那麼我哪裏錯了?

回答

1

在這裏,我們去...

pid1=fork() 

此時兩個進程會。父母[PID 4962]和剛產卵的孩子[PID 4963]。父已PID1 = 4963 [孩子的PID]和孩子[child1]有PID1 = 0。所以,孩子就會打印出:

"PID of child 1 is: 4963" 

而且這兩個過程在他們快樂的方式去,直到他們得到:

pid2=fork() 

這裏,父節點[PID 4962]和child1 [PID 4963]都產生了一個子進程。我們將調用原始父親產生child2 [也許是PID 4964]和child1產生的孩子,我們將調用child1_1 [也許是PID 4966]。現在,原來的家長有 PID2 = 4964 [也許]和的child2已PID2 = 0 Child1有PID2 = 4966 [也許]和child1_1有PID2 = 0。因此,兩者的child2和child1_1將打印出來的東西:

"PID of child 2 is: 4966" 
"PID of child 2 is: 4964" 
現在

,所有這些過程得到這個:

pid3=fork() 

哎喲。

原來的母公司,child1,的child2和child1_1都生成一個子進程。 最終最終會是這樣的:

對於原始父級,child1,child2和child1_1,pid3!= 0 對於他們的四個孩子的過程,PID3 == 0

所以,這四個孩子處理所有報告它們的PID是這樣的:

"PID of child 3 is: xxxx" 

但原始父[4962],child1 [4963],的child2 [也許4964]和child1_1 [4966也許] 打印:

"PID of parent is: xxxx" 

,然後等待與PID的PID1,PID2,PID3和其子進程返回。

請記住,所有這些進程都在同時運行,並解釋了爲什麼您無法預測打印語句將執行的打印語句的順序 。

+0

你好,我真的很感激你的耐心!一切都很好,只不過我留下了更多的疑問,在這裏,請不要介意。當遇到pid2時,它有兩個父母,所以它打印了「父親的pid」兩次,但是當遇到pid3時,爲什麼不打印「父母的pid是」4次,雖然它有4個父母? – jeevan 2014-10-29 18:46:57

+1

我認爲混淆是在你的else子句的範圍內。如果您仔細檢查代碼中的大括號,您會發現else子句僅與「if(pid3 == 0)」相關聯。所以,事實上,四個最終父母正在打印出他們自己的PID ......但只有一次他們沒有通過「if(pid3 == 0)」測試。 – seanoftime 2014-10-29 19:00:45

+0

謝謝!完全錯過了完全混亂! :) – jeevan 2014-10-29 19:20:56

相關問題