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

4

2 回答 2

20

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

于 2012-11-01T04:02:34.427 回答
2

取自:

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fapis%2Fgetppid.htm

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

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

于 2012-11-01T04:26:10.280 回答