2014-10-02 32 views
1

我寫了下面的C代碼:內容叉之前寫的()出現在輸出兩次

#include<stdio.h> 

int main(){ 
    printf("A"); 
    if(fork() == 0){ 
     printf("B"); 
    } 
    else{ 
     printf("C"); 
    } 
} 

我得到的輸出是:

ACAB 

我希望這個代碼打印一次。
任何人都可以解釋這個輸出嗎?

+1

使用描述_why_或_how_的主題行是「不按預期行事」的理想選擇。我試圖適當地改進這一個。 – 2014-10-02 14:04:07

+0

這很棘手。有些僱主喜歡問這個問題。 'fork'從父到用戶複製每個數據,包括IO緩衝區。這是那個副作用。 – HuStmpHrrr 2014-10-02 14:15:30

回答

3

您的錯誤不會在fork -ing之前刷新緩衝區,因此兩個進程都會寫入它。

fork()之前添加這樣的:

fflush(0); // Flush all output-streams 
+0

謝謝,添加fflush(0)工作。 – dynamo 2014-10-02 14:11:49

1

的「A」被存儲在緩衝器中,並通過沖洗兩個過程時,他們退出。

+0

好了,在fork()調用之後,子進程還創建了父緩衝區的副本,這就是爲什麼我得到這個輸出。 – dynamo 2014-10-02 14:14:38

+0

@dynamo - 是的,這是正確的。 – 2014-10-02 14:29:02

相關問題