如果机器立即崩溃,那么fflush()在将数据保存到磁盘方面是否与fclose()一样好?
Is fflush() as good as fclose() at saving my data to disk if the machine crashes immediately afterward?
我们的库中有一个日志记录器,它将文本行写入磁盘以供以后诊断。我们将它用于许多用途,包括分析由应用程序或我们的库引起的硬机器挂起。
我们将向日志文件写入一行,然后调用fclose(),然后在需要写入另一行时重新打开它以追加。这比在写完一行之后调用fflush()要慢35倍。
所以我的问题是,我更有可能有最后一行成功地存储在文件中与fclose()方法比fflush()方法?如果是,为什么?如果不是这样,如果不能更安全地将数据写入磁盘,那么35倍的时间是用来干什么的呢?
顺便说一下,我们最关心的是Windows。
From http://en.cppreference.com/w/c/io/fflush:
对于输出流(以及对其进行最后一次操作的更新流),从流的缓冲区中写入任何未写入的数据到相关的输出设备。
我想说fflush
应该可以满足你的需求。
每次写操作都打开和关闭文件并不是最优解决方案。文件打开是代价高昂的操作。此外,fclose()不能保证文件数据在关闭文件时立即刷新到磁盘。操作系统/文件系统将按照自己的逻辑刷新数据。
fflush()将刷新所有写入文件但尚未同步到磁盘的数据。但是,请注意,它将尝试刷新文件的所有块,而不仅仅是最近写入的块。因此,如果它是一个大文件,并且有多个应用程序写入它,那么它们的所有数据都会被刷新。但是,每次写操作都执行flush可能效率很低。
所以如果你真的想要你的数据立即写入使用直接IOs,这将直接写入数据到磁盘。如果你想让它更高效,让它们异步。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 区域设置是否有定义负号的方面?
- 查找我的算法的运行时间,以查找输入在输入方面是否是素数
- 编译器在常量表达式中认为未定义的行为方面是否允许回旋余地?
- 虚拟方法返回代表派生对象类型的枚举 - 是否可以(在设计方面)
- 在性能方面获取线程 ID 是否昂贵
- 在内存使用方面,templates+functors/lambdas是否次优
- 如果机器立即崩溃,那么fflush()在将数据保存到磁盘方面是否与fclose()一样好?
- Boost/STL在高性能计算方面是否很慢?
- 测试值是否在阈值范围内的最佳方法(性能方面)是什么