【问题标题】:Is it safe to call fflush() without fclose()在没有 fclose() 的情况下调用 fflush() 是否安全
【发布时间】:2020-06-16 16:32:50
【问题描述】:

我正在为我的嵌入式应用程序编写记录器。我需要将所有日志写入文件。目前我正在为每次写入打开和关闭文件。

为了提高性能,在整个应用程序范围内保持日志文件打开并调用 fflush() 而不在每次写入时关闭文件是否安全?

【问题讨论】:

  • 刷新可能比不刷新要好,但除此之外,它是由实现定义的,因此您应该提供有关操作系统、主板、规格等的信息。
  • 是的,fflush 不依赖于fclose(文件流应该是打开的)
  • fflush 将写入缓冲区中的剩余字节写入底层文件写入函数(Linux 下的write,或任何其他特定于实现的东西),这是有保证的。但是无法保证底层文件写入函数实际上做了什么。所以IMO它是特定于实现的。你试过只打电话给fflush吗?
  • @Jabberwocky 是的,我尝试调用 fflush 并且似乎正在工作,但想知道它是否正确。
  • @ChetanPhadtale 你的平台是什么?只是出于好奇。

标签: c fclose fflush


【解决方案1】:

如果你阅读linux程序员手册,你会发现fclose会“刷新stream指向的流并关闭底层文件描述符”。所以,你可以在没有 fflush() 的情况下调用 fclose()。

如果你想多次写入同一个文件。您可以按住打开的文件,然后多次调用 fflush 。 “fflush() 通过流的底层写入函数强制写入给定输出或更新流的所有用户空间缓冲数据”。

一句话,fflush 将缓冲数据写入文件,fclose 写入缓冲数据并关闭文件。

【讨论】:

    【解决方案2】:

    在每次写入日志后调用fflush() 并保持文件打开应该是安全的,但强烈建议以附加模式打开文件,尤其是当其他进程写入同一日志文件时。在这种情况下,确保原子写入仍然不够。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多