Когда я запускаю программу ниже:
#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), как в обычном сценарии без выхода (0) в родительском сценарии.
В этом случае n вилок = n детей (3 вилки будут производить только 3 ребенка, а не 8).Может кто-нибудь помочь мне понять, почему нет дочернего элемента (C3) для родителя (bash), так как он ждал C1, поэтому он не вышел из программы.