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

3 番目の子が親の 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 が返されました。フォークはそのプロセスを同時に実行し、特定の順序は保証されていないため、これが 3 番目の行に出力されるのはまったく正常です。

于 2012-11-01T04:26:10.280 に答える