2011-06-04 16 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