为什么来自孩子的getppid()返回1

时间:2013-04-18 08:36:53

标签: c linux process fork

我正在运行程序

#include<stdio.h>
#include <unistd.h>
main()
{
    pid_t pid, ppid;
    printf("Hello World1\n");
    pid=fork();
    if(pid==0)
    {
        printf("I am the child\n");
        printf("The PID of child is %d\n",getpid());
        printf("The PID of parent of child is %d\n",getppid());
    }
    else
    {
        printf("I am the parent\n");
        printf("The PID of parent is %d\n",getpid());
        printf("The PID of parent of parent is %d\n",getppid());        
    }
}

我得到的输出是。

$ ./a.out 
Hello World1
I am the parent
The PID of parent is 3071
The PID of parent of parent is 2456
I am the child
The PID of child is 3072
The PID of parent of child is 1

我无法理解这一行

  

孩子的父母的PID是1

应该是3071?

2 个答案:

答案 0 :(得分:15)

因为父进程在孩子要求父母的pid时完成。

当一个进程完成时,它的所有子进程都被重新分配为init进程的子进程,pid为1。

尝试在父代码中使用wait()等待子代执行。它应该按照你的预期工作。

答案 1 :(得分:-1)

pid 1用于init进程,看起来父进程在子进程打印之前完成。

如果你像这样编辑else部分: -

else
    {
        printf("I am the parent\n");
        printf("The PID of parent is %d\n",getpid());
        printf("The PID of parent of parent is %d\n",getppid());   
        while(1);
    }

你应该看到正确的输出。