【问题标题】:Write to file not visible before close; fflush(stdout) ineffective写入文件在关闭前不可见; fflush(stdout) 无效
【发布时间】:2014-06-07 22:32:51
【问题描述】:

我在写入文件时遇到了一些问题,同时在 while 循环中也有延迟。这是一个sn-p:

void main(int){
   FILE * fp = NULL;
   sprintf(filename, "log%i.msg", SET_ID);
   fp = fopen(filename, "w+");

   fprintf(fp, "File started\n");
   while(1){
      fprintf(fp, "%i %u %s\n", someInt, someUnsigned, someString);
      fflush(stdout);

      sleep(5); // Commenting out this line will work
   }
   fclose(fp);
   return 1;
}

运行代码会给我一个 0 字节的输出文件,在睡眠生效时其中没有任何内容,尽管当我的代码完成运行时该文件确实具有预期的内容。但是,当我删除 sleep(5); 行时,它确实可以正确打印。我已经对此进行了搜索,但我发现它需要刷新,但我这样做了(尽管显然不正确)。我做错了什么?

【问题讨论】:

    标签: c file sleep


    【解决方案1】:

    您正在刷新标准输出。您需要刷新文件。

    改变

    fflush(stdout)
    

    到

    fflush(fp)
    

    关于为什么 sleep() 似乎会影响文件中的内容是否可见:如果没有它,您会以更高的速率写入文件,因此您需要填写内存缓冲区并更快地刷新到磁盘。但是,如果您有足够的耐心,即使存在 sleep(),您也会在磁盘上看到内容。

    【讨论】:

    • 现在这是一个非常烦人的错误,我猜是没有考虑清楚。谢谢,使用正确的冲洗方法!
    • 我认为 fclose 会在关闭前刷新 (man7.org/linux/man-pages/man3/fclose.3.html),所以我不明白您为什么在这里遇到原始问题,以及为什么删除睡眠是相关的
    • @mc110,确实,关闭文件确实会隐式刷新。但是,如果使用无限循环,则永远无法到达。
    • stackoverflow.com/questions/8175827/… 建议只要您的程序正常结束,流就会被刷新。我不知道如果您进行写入并且程序无限期地保持打开而不刷新或关闭,您有什么保证。我怀疑在这种情况下你可能永远看不到输出 - 这与我在过去很少生成少量输出而不会刷新或关闭的 C 程序中看到的一致。
    • @arbitter,对于触发刷新而言,重要的不是睡眠时间,而是缓冲区中累积的数据量;增加睡眠无济于事,您等待多长时间“verrrry”无关紧要 - 只有在那段时间内积累的缓冲数据量很重要。至于在信号驱动的退出后您对持久性有什么保证或没有什么保证——这取决于您当地标准 C 库的实现,以及正在处理的信号类型(SIGTERM 允许更多的机会刷新而不是SIGKILL)。
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 2013-03-29
    • 2017-04-29
    • 2017-03-21
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多