Не могу понять вывод fork (), когда есть выход (0) в родителе - PullRequest
0 голосов
/ 14 октября 2018

Когда я запускаю программу ниже:

#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, поэтому он не вышел из программы.

1 Ответ

0 голосов
/ 14 октября 2018

Вот пошаговое руководство:

  • Процесс P создает C1

    • Процесс P затем блокирует ожидание C1 [i = 0]
  • C1 печатает «Я - дитя» и возвращается назад [i = 1]

  • C1-вилка C2

    • Блоки C1, ожидающие C2
  • C2, печатают «Я - дитя» и возвращаемся назад [i = 2]

  • C2 вилкиC3

    • C2 блокирует ожидание C3
  • C3 печатает "Я - ребенок" и цикл заканчивается

  • C3 выходит

  • C2 разблокирует, печатает, что C3 вышел, а затем сам выходит

  • C1 разблокирует, печатает, что С2 вышел, а затем выходит

  • P разблокирует, печатает, что С1 вышел, а затем выходит

Нет 8 детейпотому что родитель никогда не заканчивает итерацию полного цикла, кроме как в самом последнем случае.Посмотрите на это с точки зрения только процесса P: вы раскладываете ребенка, ждете, пока он закончится, и затем выходите.

...