2017-02-10 51 views
1
#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,第一个进程)。父母程序会被终止是否有任何理由?为什么子进程认为父进程ID是1?

+0

下次请正确格式化您的代码。 – d3L

+1

它没有任何理由坚持下去,假设你选择的代码的其余部分*不*发布在父进程代码路径中没有'wait'等待它的子进程完成并收集其状态。 – WhozCraig

+0

OT:'fork()'返回一个'pid_t',而不是'int',顺便说一句。 'getpid()'和'getppid()'是相同的。 – alk

回答

3

由于孩子睡觉时,在它调用getppid()时,其父母可能会死亡,并且孩子将被重新初始化到init进程(pid == 1)。

2

父进程不会等待(通过wait(2))子进程完成。因此,如果父母在孩子之前退出(它变成orphan process),那么子进程将被重新授权(采用)至初始进程的进程ID通常为1.因此,子进程表示其父进程ID为1.

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

+0

对于最近的Linux,采用者甚至不需要'init'进程了。看到这个评论:https://stackoverflow.com/questions/10519842/is-it-possible-to-adopt-a-process#comment47719364_10550076 – alk

+0

“初始化”是更多的传统名称(从Unix天的历史名称)。 Debian称它为例,使用systemd。 –

+0

我不是指这个。用'PR_SET_CHILD_SUBREAPER'(与'prctl()')一起使用的特别的,安静的新事物是运行时的父节点可以决定哪个进程应该采用它的子节点... :-) – alk