2011-06-04 29 views
5

我對C非常陌生,請耐心等待。我很長時間都在苦苦掙扎,我很難縮小錯誤的原因。C寫入文件時奇怪的異常(寫入標準輸出時正常工作)

我注意到,當分叉進程和寫入文件(只有原始進程寫入文件發生了奇怪的事情,輸出幾乎乘以叉的數量,很難解釋,因此我做了一個小測試代碼在那裏你可以file=stdout運行,它再現了問題

#include <stdio.h> 
#include <stdlib.h> 


void foo() 
{ 
    FILE* file = fopen("test", "w"); 
    int i=3; 
    int pid; 
    while (i>0) 
    { 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("Child\n"); 
     exit(0); 
    } 
    else if(pid > 0) 
    { 
     fputs("test\n", file); 
     i=i-1; 
    } 
} 

} 

int main() 
{ 
    foo(); 
    exit(EXIT_SUCCESS); 
} 

編譯並運行它,一旦它的方式是,一旦當寫stdout輸出爲:。

 
test 
test 
test 

但寫作時到f ILE輸出爲:

 
test 
test 
test 
test 
test 
test 

此外,如果你添加索引和變更i到一個更大的數字,你可以看到某種模式,但這並不能幫助我。

坦率地說,我不知道爲什麼會發生這種情況,既不知道如何解決這個問題。但我是C的新手,所以這可能只是一個正常的邏輯解釋=)。

謝謝你的所有時間和答案。

回答

8

stdout通常無緩衝或線路緩衝;其他文件通常是塊緩衝。你需要在fork()之前fflush(),否則每個孩子都會刷新自己的緩衝區副本,導致這種增加。

+0

非常感謝您的快速回答。我花了很多時間檢查所有的代碼,甚至當我注意到這一點時,我仍然不知道它是什麼。現在我覺得有點愚蠢,但嘿,每個人都需要學習。再次感謝。 – Ben 2011-06-04 20:52:48

+1

POSIX中的相關文本在這裏:http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05_01 – 2011-06-04 21:22:22

+0

不應該'printf(「Child \ n」);'互斥體鎖定? – farhanhubble 2011-06-06 19:33:43