wait()如何在Linux中运行?

时间:2014-10-29 17:11:44

标签: linux process

任何人都可以解释为什么输出是这样的?我对这些流程的执行方式(按哪种顺序?)以及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

预期输出:

  1. 父母的PID因为pid1不是0而且永远不会是0。

  2. 然后等到pid1,即child1被终止并打印子1的PID

  3. 那么现在child2和child3还没有分叉,所以它们被跳过了

  4. 然后父母的PID,child1的pid,child2的pid

  5. 然后父母的PID,child1的pid,child2的pid和child3的pid。

  6. 那我在哪里出错?

1 个答案:

答案 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返回。

请记住,所有这些进程都在同时运行,这就解释了 为什么你不一定能预测打印语句的顺序 进行。