我有以下代码:
#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进入的进程在哪里。由于这段代码,创建了多少总进程?最终的流程树是什么?我是初学者。
答案 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;
}