POSIX保证写入磁盘

时间:2012-11-02 19:29:22

标签: c file-io io posix storage

据我了解,如果我想将数据同步到存储设备,我可以使用fsync()来刷新所有操作系统输出缓存......但显然它根本不能保证这一点,不像文档尝试欺骗你,数据可能无法写入磁盘!

这对于许多目的来说并不是很好,因为它可能导致数据损坏。如何使用POSIX库(如果可能,以便携方式)保证数据已写入(尽可能)并防止数据损坏?

有fdatasync()但它没有在OSX上实现,所以有更好更便携的方式,还是必须在不同的系统上实现不同的代码?我也不确定fdatasync()是否足够好。

当然,在最糟糕的情况下,我可能会忘记这一点,并使用一个使用ACID存储数据的冗余数据库。我不希望这样。

此外,我对如何确保截断和重命名操作已经完成感兴趣。

谢谢!

1 个答案:

答案 0 :(得分:6)

您正在寻找同步。有一个名为sync的程序和一个名为sync(man 1 syncman 2 sync的系统调用):

   #include <unistd.h>

   void sync(void);

DESCRIPTION
   sync() first commits inodes to buffers, and then buffers to disk.

因此,它将确保所有挂起的操作(截断,重命名等)实际上写入磁盘。

fsync并未声明刷新所有输出缓存,而是声称将对特定文件描述符的所有更改刷新到磁盘。它明确地不确保更新目录条目(在这种情况下,需要在目录的filedescriptor上调用fsync)。

fsyncdata更加无用,因为它不会刷新文件元数据,而只会确保刷新文件中的数据。

信任联机帮助页是个好主意。我不会说没有错误,但它们往往非常准确。