子进程的进程父ID与父进程的PID不同

我正在尝试使用C中的fork()函数在Linux中使用多个进程,这是我的代码:

p1 = fork();

if(p1 != 0){
    p2 = fork();
}

printf("My PID is %d\n",getpid());
printf("My parent PID is %d\n",getppid());

现在让我们假设父进程ID是100,并且两个子进程(p1,p2)ID是101& 102,init进程PID将为0我的预期输出是:

My PID is 100
My parent PID is 0

My PID is 101
My parent PID is 100

My PID is 102
My parent PID is 100

相反,我看到不同的东西,两个子进程具有相同的PPID,但第一个进程具有不同的PID.这是我得到的示例输出:

My PID is 3383
My parent PID is 3381

My PID is 3387
My parent PID is 1508

My PID is 3386
My parent PID is 1508

我的问题是,两个子进程的父PID不应该是3383吗?
希望有人可以解释这一切是如何起作用的,以及我在做什么(或思考)错误.

最佳答案
[通过评论确认]

您的输出取决于时间.如果父进程在子进程处理完成后,您的输出将按预期进行.

如果父进程在子进程之前完成,则输出可能会令人惊讶(在父进程不再存在之前,父ID将不同).一旦父进程死亡(结束),init或其他一些实现定义的进程(在你的情况下为1508),就成为子进程的新父进程(ren).这些孩子被称为孤儿过程.

根据The Single UNIX Specification,Version 2中的exit手册页:

The parent process ID of all of the existing child processes and zombie processes of the calling process shall be set to the process ID of an implementation-defined system process. That is, these processes shall be inherited by a special system process.

要避免这种情况,请确保在获取父pid时父进程处于活动状态.一种方法是在退出之前在父(或所有)进程中添加等待.

转载注明原文:子进程的进程父ID与父进程的PID不同 - 代码日志