2011-08-15 185 views
1

我正在嘗試一些簡單的代碼上叉。當我給出這樣的代碼時,它工作正常。這將打印叉和殭屍進程

我是孩子

我父

,然後等待30秒。我明白這是由於這兩個過程之間的切換。第一個孩子,然後執行父母和子女,然後...

#include<stdio.h> 
#include<stdlib.h> 
main() 
{ 
    int pid; 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("\nI am the child\n"); 
     sleep(30); 
     exit(0); 
    } 
    if(pid>0) 
    { 
     printf("\nI am the parent\n"); 
     wait(); 
    } 
} 

但是,當我給像(無父等待)

#include<stdio.h> 
#include<stdlib.h> 
main() 
{ 
    int pid; 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("\nI am the child\n"); 
     sleep(30); 
     exit(0); 
    } 
    if(pid>0) 
    { 
     printf("\nI am the parent\n"); 

    } 
} 

它只是打印

我是孩子

我是母公司

並退出(不等待30秒)。

那麼是因爲沒有等待調用父節點退出並且子節點仍在執行?但爲什麼它沒有出現在終端(等待中)?

父母是否在這裏變成殭屍?

+1

請不要使用太多的問號。 ;-) – Nayuki

回答

4

您的觀察結果是正確的。

終端等待原始進程(即父節點)退出。它不會等待任何子進程退出。

殭屍:一個進程是一個殭屍,如果它已經退出,但是它的父進程沒有對它調用wait()。

在你的情況下,父母不會成爲殭屍,因爲終端正在等待它。

0

shell正在等待父項完成,但未等到子項。

孩子在30秒後變成殭屍(該shell將在下一次提示時清理)。

2
  1. 是的。
  2. 祖父母從不等待孩子;沒有父母的孩子被重新初始化。
  3. 不,它會死亡。
+0

3需要澄清。殭屍也死了。 –

0

在第二個例子中,孩子成爲孤兒,因爲父母在孩子活着時已經返回。孤兒進程屬於init而不是shell,這就是爲什麼它沒有顯示出來。你的兩個代碼示例中沒有殭屍。殭屍是當父母活着的時候,孩子已經死了,家長沒有打電話等孩子變成殭屍。