为什么这个ppid == 1?我错过了关于fork()的一些事情吗?

zjk*_*zjk 5 c fork

#include <stdio.h>

int main(void)
{
    fork();
    fork();
    printf("ppid %d pid %d\n", getppid(), getpid());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以上代码有时会打印出来

$ ./a.out 
ppid 3389 pid 3883
ppid 3883 pid 3885
ppid 1 pid 3884
ppid 3884 pid 3886
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*arp 12

我猜父进程已经完成运行并在第三个子进行父进程PID检查时退出.这将导致孩子重新成为父母init,其过程ID为1.

  • 这是一个很好的猜测:) 我在我的代码中添加了一个 `sleep_for`(见 [this](/sf/ask/1652665521/)问题)比运行程序所需的时间更长。只要我可以保留父级直到其所有子级完成执行后,ppid 就永远不会返回为“1”。感谢@jamey-sharp 的启发。 (2认同)