在shell中执行fork命令以打印进程ID

时间:2015-09-26 09:58:18

标签: c shell unix fork process-reaper

我正在尝试在运行pid命令后打印fork()进程。这是我的代码 -

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    int pid;
    pid=fork();
    if(pid==0)
        printf("I am the child.My pid is %d .My parents pid is %d \n",getpid(),getppid());
    else
        printf("I am the parent.My pid is %d. My childs pid is %d \n",getpid(),pid);
    return 0;
}

这是我得到的答案 -

I am the parent.My pid is 2420. My childs pid is 3601 
I am the child.My pid is 3601 .My parents pid is 1910 

为什么第二行中的父母ID不是2420。为什么我会1910如何获得此值?

1 个答案:

答案 0 :(得分:7)

在孩子执行printf来电之前父母正在退出。当父母退出时,孩子会得到一个新的父母。默认情况下,这是init进程,PID 1.但最新版本的Unix增加了进程将自己声明为“subreaper”的能力,该子进程继承了所有孤立的子进程。 PID 1910显然是您系统的辅助设备。有关详细信息,请参阅https://unix.stackexchange.com/a/177361/61098

在父进程中调用wait(),使其等待子进程继续运行。

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    int pid;
    pid=fork();
    if(pid==0) {
        printf("I am the child.My pid is %d .My parents pid is %d \n",getpid(),getppid());
    } else {
        printf("I am the parent.My pid is %d. My childs pid is %d \n",getpid(),pid);
        wait(NULL);
    }
    return 0;
}