C写异常时异常(写入stdout时正常工作)

时间:2011-06-04 20:33:08

标签: c file stdout

我对C很新,所以请耐心等待。很长一段时间我都在努力解决这个问题。我很难缩小错误原因。

我注意到在分叉进程和写入文件时(只有原始进程写入文件时发生奇怪的事情,输出几乎乘以分叉数,难以解释,因此我做了一个小测试代码您可以在哪里运行并重新创建问题。

#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);
}

按照原来的方式编译并运行它,并使用file=stdout编译一次。写入stdout时输出为:

test
test
test

但是当写入文件时输出是:

test
test
test
test
test
test

此外,如果您添加索引并将i更改为更大的数字,您可以看到某种模式,但这对我没有帮助。

坦率地说,我不知道为什么会发生这种情况,也不知道如何解决这个问题。但我是C的新手,所以这可能只是一个正常的逻辑解释=)。

感谢您的所有时间和答案。

1 个答案:

答案 0 :(得分:8)

stdout通常是无缓冲或行缓冲的;其他文件通常是块缓冲的。你需要在fflush()之前fork(),或者每个孩子都会刷新自己的缓冲区副本,从而导致这种倍增。