C 为什么这个ppid==1?我是否遗漏了有关fork()的内容?

C 为什么这个ppid==1?我是否遗漏了有关fork()的内容?,c,fork,C,Fork,为什么3884过程的ppid为1?不是应该是3883吗?我猜在第三个子进程检查父进程的PID时,父进程已经完成运行并退出。这将导致子项在进程ID为1的init下重新成为父项。取自: “getppid()返回的值是调用进程的父进程的进程ID。进程ID值为1表示没有与调用进程关联的父进程。” 该printf指令是在父进程内执行的,因此它返回1,因为它没有父进程。这是要打印的第三行,这是完全正常的,因为fork同时运行其进程,并且不保证特定的顺序 当进程3883从main返回并且不再存在时,它怎么可

为什么3884过程的ppid为1?不是应该是3883吗?

我猜在第三个子进程检查父进程的PID时,父进程已经完成运行并退出。这将导致子项在进程ID为1的
init
下重新成为父项。

取自:

“getppid()返回的值是调用进程的父进程的进程ID。进程ID值为1表示没有与调用进程关联的父进程。”


该printf指令是在父进程内执行的,因此它返回1,因为它没有父进程。这是要打印的第三行,这是完全正常的,因为fork同时运行其进程,并且不保证特定的顺序

当进程3883从main返回并且不再存在时,它怎么可能是3883?如果它没有退出,这将是一个很好的方法,使您的系统不起作用。我不认为这可以解释观察到的症状。运行
/a.out
的原始进程应该将shell作为其父进程。这是一个很好的猜测:)我在代码中添加了一个
sleep\u for
(请参见问题),时间比运行程序所用的时间长。只要我能保持父对象在所有子对象完成执行之前,ppid就不会返回为“1”。感谢杰米·夏普的启发。
#include <stdio.h>

int main(void)
{
    fork();
    fork();
    printf("ppid %d pid %d\n", getppid(), getpid());
    return 0;
}
$ ./a.out 
ppid 3389 pid 3883
ppid 3883 pid 3885
ppid 1 pid 3884
ppid 3884 pid 3886