2014-02-25 135 views
3

一段簡單的代碼:如果我在main中調用fork(),會發生什麼?

#include <stdio.h> 
#include <string.h> 

main() 
{ 
    printf("Process"); 
    fork(); 
    fork(); 
    return 0; 
} 

從我的叉子的理解(),這個代碼後執行,我們將有3個進程和1個父進程。此外,只要我們調用fork(),執行應該立即從fork()語句之後的語句開始。因此根據我的說法「過程」應該只打印一次。但在我的輸出過程正在打印4次。這怎麼可能?

+0

是看起來是這樣的。我應該刪除這個還是讓它成爲? – bigbong

回答

10

由於默認情況下標準輸出爲行緩衝,所以當您調用fork()時,輸出緩衝區會被所有子進程繼承。

有幾種不同的方式來改變這種行爲:

末添加新的行字符:

printf("Process\n"); 

或致電fflush()刷新輸出:

printf("Process"); 
fflush(stdout); 

或將標準輸出更改爲不使用setbuf() or setvbuf()

setbuf(stdout, NULL); 
printf("Process"); 

無論使用哪種方式,您只會看到一次輸出。

注意:請參閱@Dvaid Schwartz's answer以瞭解代碼中多次調用atexit()的錯誤。

+4

這實際上並沒有修復這個錯誤。它只是將代碼從「有一個可怕的錯誤導致它做錯了事」改爲「有一個可怕的錯誤發生,不會因運氣而受到傷害」。它解釋了他的結果,但沒有解決潛在的問題(atexit處理程序運行四次),也沒有告訴他如何解決潛在的問題。 –

+0

好的..不知道這個。謝謝! – bigbong

4

您的程序有一個錯誤。 全部孩子從main返回,導致atexit處理程序運行四次。孩子們應該撥打_exit

這裏是你的代碼應該是什麼樣子:

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

main() 
{ 
    int is_child = 0; 
    printf("Process"); 

    if (fork() == 0) 
     is_child = 1; 

    if (fork() == 0) 
     is_child = 1; 

    if (is_child) 
     _exit(0); 

    return 0; 
} 
+0

如果孩子需要打印一些標準輸出,它... – user3125367

+2

好吧,我明白了。這種錯誤會導致什麼樣的不利影響? – bigbong

+0

你能解釋爲什麼反覆調用這樣的處理程序是件壞事嗎? –

相關問題