我寫了下面的C代碼:內容叉之前寫的()出現在輸出兩次
#include<stdio.h>
int main(){
printf("A");
if(fork() == 0){
printf("B");
}
else{
printf("C");
}
}
我得到的輸出是:
ACAB
我希望這個代碼打印一次。
任何人都可以解釋這個輸出嗎?
我寫了下面的C代碼:內容叉之前寫的()出現在輸出兩次
#include<stdio.h>
int main(){
printf("A");
if(fork() == 0){
printf("B");
}
else{
printf("C");
}
}
我得到的輸出是:
ACAB
我希望這個代碼打印一次。
任何人都可以解釋這個輸出嗎?
您的錯誤不會在fork
-ing之前刷新緩衝區,因此兩個進程都會寫入它。
fork()
之前添加這樣的:
fflush(0); // Flush all output-streams
謝謝,添加fflush(0)工作。 – dynamo 2014-10-02 14:11:49
的「A」被存儲在緩衝器中,並通過沖洗兩個過程時,他們退出。
好了,在fork()調用之後,子進程還創建了父緩衝區的副本,這就是爲什麼我得到這個輸出。 – dynamo 2014-10-02 14:14:38
@dynamo - 是的,這是正確的。 – 2014-10-02 14:29:02
使用描述_why_或_how_的主題行是「不按預期行事」的理想選擇。我試圖適當地改進這一個。 – 2014-10-02 14:04:07
這很棘手。有些僱主喜歡問這個問題。 'fork'從父到用戶複製每個數據,包括IO緩衝區。這是那個副作用。 – HuStmpHrrr 2014-10-02 14:15:30