2012-11-01 26 views
2
#include <stdio.h> 

int main(void) 
{ 
    fork(); 
    fork(); 
    printf("ppid %d pid %d\n", getppid(), getpid()); 
    return 0; 
} 

上面的代碼有時打印爲什麼這個ppid == 1?我錯過了關於fork()的東西嗎?

$ ./a.out 
ppid 3389 pid 3883 
ppid 3883 pid 3885 
ppid 1 pid 3884 
ppid 3884 pid 3886 

爲什麼是過程3884的PPID 1?它不應該是3883嗎?

+0

當進程3883從main返回並且不再存在時,它怎麼能是3883?如果它沒有退出,這將是一個讓你的系統無法正常工作的好方法。 –

回答

8

我猜父程序已經完成運行,並在第三個孩子檢查父母的PID時退出。這將造成兒童被init下重新父,其具有進程ID爲1

2

來自

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

「由getppid()返回的值是的進程ID進程標識值爲1表示沒有父進程與調用進程關聯。「

printf指令在父進程中執行,所以它返回1,因爲它沒有父進程。這是打印的第三行是非常正常的,因爲fork同時運行它的過程,並且沒有特定的順序保證。

+0

我不認爲這解釋了觀察到的症狀。運行'./a.out'的原始進程應該有shell作爲其父進程。 –

相關問題