2017-02-10 1168 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