【问题标题】:C strange anomaly, when writing to file (works normally when writing to stdout)C 奇怪的异常,写入文件时(写入标准输出时正常工作)
【发布时间】:2011-06-04 20:33:08
【问题描述】:

我对 C 很陌生,所以请多多包涵。我为此苦苦挣扎了很长时间,并且很难缩小错误的原因。

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

#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 时,输出为:

测试 测试 测试

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

测试 测试 测试 测试 测试 测试

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

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

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

【问题讨论】:

    标签: c file stdout


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的快速回答。我花了很多时间检查所有代码,即使我注意到这一点,我仍然不知道它是什么。现在我觉得有点傻,但是,嘿,每个人都需要学习。再次感谢。
    • POSIX中的相关文字在这里:pubs.opengroup.org/onlinepubs/9699919799/functions/…
    • 不应该printf("Child\n");被互斥锁吗?
    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多