2013-02-20 81 views
3

我在代碼中創建子進程。當我調用fork()時,子進程應該從下一個語句開始執行,但在我的代碼中,子進程在fork調用之前執行語句。子進程執行fork調用之前寫入的語句

#include<stdio.h> 
int main() 
{ 
int pid; 
FILE *fp; 
fp = fopen("oh.txt","w"); 
fprintf(fp,"i am before fork\n"); 
pid = fork(); 
     if(pid == 0) 
     { 
       fprintf(fp,"i am inside child block\n"); 
     } 
     else{ 
       fprintf(fp,"i inside parent block\n"); 
     } 
fprintf(fp,"i am inside the common block to both parent and child\n"); 
fclose(fp); 
return 0; 
} 

這是它的輸出我得到

OUTPUT:

i am before fork 
i inside parent block 
i am inside the common block to both parent and child 
i am before fork 
i am inside child block 
i am inside the common block to both parent and child 

行「我是叉之前」應一次在文件中寫的,但它是由孩子寫兩次,家長。 爲什麼是這樣?

謝謝。

+4

添加'fflush(FP)'你叉掉了。 – 2013-02-20 16:17:17

回答

4

這可能是一個緩衝問題。 fprintf不立即寫入文件,而是緩存輸出。當你fork,你最終得到兩個緩衝區的副本。

儘量分叉,看看是否能解決這個問題之前,做一個fflush(fp)

+0

謝謝nneonneo,使用fflush(fp)可以正常工作 – 2013-02-20 16:19:53

2

我想這是因爲你有fprintf打印,它得到緩衝,但不打印,然後它被印在子進程時,緩衝區被刷新。