一尘不染

强制将文件写入磁盘

linux

我目前正在实施ping / pong缓冲方案,以安全地将文件写入磁盘。我在Linux / CentOS计算机上使用C ++ /
Boost。现在,我面临的问题是强制将文件实际写入磁盘。不管文件系统的所有缓存策略(ext3 / ext4)/ SO自定义规则/
RAID控制器/硬盘控制器如何,都可以这样做吗?

最好使用普通的fread()/ fwrite(),c ++ ostream或boost文件系统?

我听说,仅刷新文件(fflush())并不能保证实际写入


阅读 307

收藏
2020-06-07

共1个答案

一尘不染

fflush(对于FILE *),std :: flush(对于IOStream)强制您的程序发送到OS。

POSIX有

  • sync(2)要求计划写入其缓冲区,但是可以在写入完成之前返回(Linux等待返回之前将数据发送到硬件)。

  • fsync(2)可以保证等待数据发送到硬件,但是需要一个文件描述符(您可以使用fileno(3)从FILE *获取一个文件描述符,我知道没有标准的方法可以从IOStream)。

  • O_SYNC作为打开(2)的标志。

在所有情况下,硬件都可能拥有自己的缓冲区(但是,如果有控制权,一个好的实现也将尝试刷新它们,并且ISTR表示某些磁盘正在使用电容器,以便它们能够刷新电源发生的任何变化)网络文件系统也有自己的警告。

2020-06-07