如果机器立即崩溃,那么fflush()在将数据保存到磁盘方面是否与fclose()一样好?

Is fflush() as good as fclose() at saving my data to disk if the machine crashes immediately afterward?

本文关键字:是否 方面 磁盘 fclose 一样 数据 崩溃 机器 那么 如果 fflush      更新时间:2023-10-16

我们的库中有一个日志记录器,它将文本行写入磁盘以供以后诊断。我们将它用于许多用途,包括分析由应用程序或我们的库引起的硬机器挂起。

我们将向日志文件写入一行,然后调用fclose(),然后在需要写入另一行时重新打开它以追加。这比在写完一行之后调用fflush()要慢35倍。

所以我的问题是,我更有可能有最后一行成功地存储在文件中与fclose()方法比fflush()方法?如果是,为什么?如果不是这样,如果不能更安全地将数据写入磁盘,那么35倍的时间是用来干什么的呢?

顺便说一下,我们最关心的是Windows。

From http://en.cppreference.com/w/c/io/fflush:

对于输出流(以及对其进行最后一次操作的更新流),从流的缓冲区中写入任何未写入的数据到相关的输出设备。

我想说fflush应该可以满足你的需求。

每次写操作都打开和关闭文件并不是最优解决方案。文件打开是代价高昂的操作。此外,fclose()不能保证文件数据在关闭文件时立即刷新到磁盘。操作系统/文件系统将按照自己的逻辑刷新数据。

fflush()将刷新所有写入文件但尚未同步到磁盘的数据。但是,请注意,它将尝试刷新文件的所有块,而不仅仅是最近写入的块。因此,如果它是一个大文件,并且有多个应用程序写入它,那么它们的所有数据都会被刷新。但是,每次写操作都执行flush可能效率很低。

所以如果你真的想要你的数据立即写入使用直接IOs,这将直接写入数据到磁盘。如果你想让它更高效,让它们异步。