首页 文章

在父项中有退出(0)时无法理解fork()的输出

提问于
浏览
2

当我在程序下面运行时:

#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 回答

  • 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的角度来看它:你分叉一个孩子,等待它完成,然后退出 .

相关问题