任何人都可以解释为什么输出是这样的?我对这些流程的执行方式(按哪种顺序?)以及waitpid()
/ wait()
非常困惑。
这是代码:
#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被终止并打印子1的PID
那么现在child2和child3还没有分叉,所以它们被跳过了
然后父母的PID,child1的pid,child2的pid
然后父母的PID,child1的pid,child2的pid和child3的pid。
那我在哪里出错?
答案 0 :(得分: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返回。
请记住,所有这些进程都在同时运行,这就解释了 为什么你不一定能预测打印语句的顺序 进行。