任何人都可以請解釋爲什麼輸出是這樣的?我對這些過程如何執行(以何種順序?)以及關於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
預期輸出:
PID父母因爲PID1不爲0,永不0這裏。
然後等待,直到PID1即child1被終止並打印PID孩子1
。然後現在的child2,所以他們被跳過
話又說回來父的PID child3還沒有分叉,PID child1,的child2
的PID的然後父母,child1的PID,和的child2的child3 PID的PID的PID。
那麼我哪裏錯了?
你好,我真的很感激你的耐心!一切都很好,只不過我留下了更多的疑問,在這裏,請不要介意。當遇到pid2時,它有兩個父母,所以它打印了「父親的pid」兩次,但是當遇到pid3時,爲什麼不打印「父母的pid是」4次,雖然它有4個父母? – jeevan 2014-10-29 18:46:57
我認爲混淆是在你的else子句的範圍內。如果您仔細檢查代碼中的大括號,您會發現else子句僅與「if(pid3 == 0)」相關聯。所以,事實上,四個最終父母正在打印出他們自己的PID ......但只有一次他們沒有通過「if(pid3 == 0)」測試。 – seanoftime 2014-10-29 19:00:45
謝謝!完全錯過了完全混亂! :) – jeevan 2014-10-29 19:20:56