#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
为什么流程3884的ppid 1?它不应该是3883吗?
答案 0 :(得分:12)
我猜父进程已经完成运行,并在第三个子进行父进程PID检查时退出。这可能会导致孩子在init
下重新成为父母,而{1}}的进程ID为1。
答案 1 :(得分:2)
取自:
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fapis%2Fgetppid.htm
“getppid()返回的值是调用进程的父进程的进程ID。进程ID值为1表示没有与调用进程关联的父进程。”
该printf指令是在父进程中执行的,因此它返回1,因为它没有父进程。这是第三行打印是完全正常的,因为fork同时运行其进程并且没有特定的顺序被保证。