强制将文件写入磁盘

Gia*_*ini 5 c++ unix linux disk fflush

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

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

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

APr*_*mer 6

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

POSIX有

  • sync(2)要求安排写入缓冲区,但可以在写入完成之前返回(Linux正在等待数据在返回之前发送到硬件).

  • fsync(2)保证等待数据发送到硬件,但需要一个文件描述符(你可以从带有fileno(3)的FILE*中获取一个,我知道没有标准的方法来获取一个的iostream).

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

在所有情况下,硬件可能都有自己的缓冲区(但是如果它有控制权,那么一个好的实现方法也会尝试刷新它们,并且ISTR认为某些磁盘正在使用电容器,这样它们就能够清除电源发生的任何事情)和网络文件系统有自己的警告.