当我在程序下面运行时:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
//multiple children of the same parent
void main(){
int pid,i;
for(i=0;i<3;i++){
pid = fork();
if(pid<0)
printf("fork failed.");
else if(pid>0){
wait(NULL);
printf("i =%d, Child has finished. I am the parent[PID=%d].\n",i,getpid());
_exit(0);
}
else{
printf("i = %d, pid =%d, I am the child[PID=%d], parent[PID=%d] \n",i,pid, getpid(),getppid());
}
}
}
我得到以下输出:
i = 0, pid =0, I am the child[PID=7720], parent[PID=7719]
i = 1, pid =0, I am the child[PID=7721], parent[PID=7720]
i = 2, pid =0, I am the child[PID=7722], parent[PID=7721]
i =2, Child has finished. I am the parent[PID=7721].
i =1, Child has finished. I am the parent[PID=7720].
i =0, Child has finished. I am the parent[PID=7719].
但是,我无法理解输出 .
如果我们追踪树 . 假设父代表运行该程序的bash . 所以在fork之后,我们将为该父级生一个孩子(称之为C1) . 由于Wait(NULL)系统调用将接收由子节点返回给父节点终止的SIGCHLD信号(PID)号,父节点必须等待它的子节点 . 然后另一个fork()已经完成从(C2)生成另一个子节点 . 但是,父节点(C3)没有其他子节点,正常情况下没有父节点中的exit(0) .
在这种情况下,n个叉子= n个孩子(3个叉子只 生产环境 3个孩子而不是8个孩子) . 有人可以帮助我理解为什么父母(bash)没有孩子(C3),因为它等待C1,所以它没有退出程序 .
1 回答
这是演练:
Process P创建C1
进程P然后阻塞等待C1 [i = 0]
C1打印“我是孩子”并循环回[i = 1]
C1叉C2
C1阻塞等待C2
C2打印“我是孩子”并循环回[i = 2]
C2叉C3
C2阻塞等待C3
C3打印"I am the child"并且循环终止
C3退出
C2解锁,打印出C3然后退出
C1取消阻止,打印出已退出的C2,然后退出
P取消阻止,打印出已退出的C1,然后退出
没有8个子节点,因为父节点永远不会完成整个循环迭代,除非在最后一种情况下 . 从进程P的角度来看它:你分叉一个孩子,等待它完成,然后退出 .