为什么子进程认为父进程的id是1?

时间:2017-02-10 18:57:36

标签: c fork posix child-process

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main ( void ) {
    int pid, fpid, ppid;

    fpid = fork();

    printf ("fpid is is %d\n", fpid);
    sleep(5);

    if (fpid > 0) {
        pid = getpid();
        ppid = getppid();
        printf ("\nThis is Parent. My pid %d. My parent's pid %d\n", pid, ppid);
    } else if (fpid == 0) {
        sleep(1);
        pid = getpid();
        ppid = getppid();
        printf ("\nThis is Child. My pid %d. My parent'a pid %d\n", pid, ppid);
    }
}

我认为当父进程ID为1时,意味着父进程已被终止,因此子进程被重新替换为1(init,第一个进程)。有没有理由说明父进程会被终止?

2 个答案:

答案 0 :(得分:3)

因为孩子睡觉,所以当它调用getppid()时,它的父母可能已经死亡,孩子将被重新定位到初始化过程(pid == 1)。

答案 1 :(得分:2)

父进程不会等待(通过wait(2))子进程完成。因此,如果父项在子项之前退出(它变为orphan process),则子进程将被重新替换(采用)到 init 进程,其进程ID通常为1.因此子进程表示其父进程ID为1.

请注意,init进程的ID在所有系统上不一定是1。 POSIX没有强制要求任何此类事情。