2017-03-07 63 views
0

我有理解這個代碼的行爲問題:不規則導致殭屍例如

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
int nr; 
nr = fork(); 
    if (nr == 0) { 
    /* Child process */ 
    printf("Child process, fork return value %d\n", nr); 
    exit(0); 
    } else { 
    /* Parent process */ 
    printf("Parent process, fork return value: %d\n", nr); 
    exit(0); 
    } 
} 

在Unix shell中運行。當我得到這樣的結果:

Parent process, fork return value: 343 
Child process, fork return value: 0 

但有時它只是給了我這個結果沒有任何shell提示符:

Child process, fork return value: 0 

我知道它可以用父進程中的wait()函數來解決。但我想知道:

爲什麼結果不規則?有人能解釋發生了什麼嗎?子進程成爲殭屍,但爲什麼父母不處理printf()函數調用運行?

+1

我想這對Linux和永遠無法看到你的描述。相反,我總是得到兩個消息。我甚至試圖給父親和/或孩子安排睡眠,但除了預期的延誤之外,沒有任何改變。從理論上講,我也找不到你的觀察結果。你介意告訴我們你的系統發生了什麼? – Alfe

+0

父進程也應該打印該消息。殭屍進程是當父進程在父進程「等待」之前完成執行的時候。 printf在它變成'殭屍進程'之前執行。父母應該打印它的消息,不管子進程是什麼......在叉子共享相同的'stdout'之後,他們是獨立的進程,因爲你沒有重定向。 –

回答

1

有2 issuse到海外商品會有: 1)還有就是你可能要刷新

fflush(stdout); 

2標準輸出緩衝)多任務有時可以執行在一個意想不到的順序 的東西,我得到這樣的事情時,出現這種情況:

/tmp$ ./a.out 
Parent process, fork return value: 24049 
/tmp$ Child process, fork return value 0 

正如你所看到的提示是在子進程輸出的開始,它不是完全缺少它只是不是你希望它是。

有了這個代碼,我試了幾次位從未有過的孩子或父母的德輸出線提示:

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
int nr; 
nr = fork(); 
    if (nr == 0) { 
    /* Child process */ 
    printf("Child process, fork return value %d\n", nr); 
    fflush(stdout); 
    exit(0); 
    } else { 
    /* Parent process */ 
    printf("Parent process, fork return value: %d\n", nr); 
    fflush(stdout); 
    sleep(1); 
    exit(0); 
    } 
} 
+0

這個答案是錯誤的,因爲無論執行順序是什麼都沒有關係,兩個消息都應該打印到'stdout'。 OP觀察到的是父母不打印。 –

+0

沒有什麼OP可能觀察到是亂序印花露水多任務。我已經重現了錯誤,並且我可以看到在其中一條輸出行中顯示的提示。 – louigi600

+0

如果他錯過了整條線,我很有可能fflush會解決這個問題。 – louigi600