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

时间:2012-11-01 03:59:40

标签: c fork

#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吗?

2 个答案:

答案 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同时运行其进程并且没有特定的顺序被保证。