通过分叉处理和创建子代:无法解释的行为

时间:2016-08-28 13:43:38

标签: linux operating-system parent-child

我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
for(int i=0;i<3;i++)
{
int cpid=fork();
if(cpid==0)
    printf("I am a child with id %d, and my parent is %d\n",getpid(),getppid());
else
    printf("I am a parent with id %d\n",getpid());
}
}

我正在尝试构建一个进程树。输出是:

I am a parent with id 9494 
I am a parent with id 9494 
I am a child with id 9495, and my parent is 9494
I am a parent with id 9494 
I am a child with id 9496, and my parent is 9494
I am a parent with id 9495 
I am a parent with id 9496 
I am a parent with id 9495 
I am a child with id 9498, and my parent is 9495
I am a parent with id 9498 
I am a child with id 9499, and my parent is 3004
I am a child with id 9497, and my parent is 3004
I am a child with id 9500, and my parent is 3004
I am a child with id 9501, and my parent is 3004

我无法弄清楚id 3004进入的进程在哪里。由于这段代码,创建了多少总进程?最终的流程树是什么?我是初学者。

2 个答案:

答案 0 :(得分:2)

我将帮助处理过程3004的谜团。其余部分应该很容易理解(您可能希望将cpid添加到第二个printf()来帮助这一点)。

I am a child with id 9499, and my parent is 3004

这里发生的事情是9499过程的原始父母在9499有机会致电getppid()之前已经去世了。当进程的父进程终止时,该进程将获得重新父级。在您的情况下,新父亲的pid是3004.此过程不是您的程序创建的过程树的一部分(它可能位于整个过程树中的某个位置),所以您不会看到a&#34;我是id&#34;为了它。

以下是一些相关的阅读:process re-parenting: controlling who is the new parent

答案 1 :(得分:1)

试试这段代码。

此代码的输出将向您解释更多内容。在父进程死后,某些进程print各自的printf函数已经死亡。这些过程(orphan process)被其他一些过程采用。这可能是由pid函数打印出奇怪printf的原因。此外,在创建进程和打印各自的race-condition之间有一个pid,可以在下面的代码输出中看到。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    printf("Main\n");
    for(int i=0;i<3;i++) {
        printf("Loop index - %d and pid is - %d\n", i, getpid());
        int cpid=fork();
        if(cpid==0) 
             printf("I am a child with id %d, and my parent is %d with loop index - %d\n",getpid(),getppid(), i);
        else
              printf("I am a parent with id %d and with loop index - %d\n",getpid(), i);
    }
    printf("Terminated - %d\n", getpid());
    return 0;
 }