据我了解,如果我想将数据同步到存储设备,我可以使用fsync()来刷新所有操作系统输出缓存......但显然它根本不能保证这一点,不像文档尝试欺骗你,数据可能无法写入磁盘!
这对于许多目的来说并不是很好,因为它可能导致数据损坏。如何使用POSIX库(如果可能,以便携方式)保证数据已写入(尽可能)并防止数据损坏?
有fdatasync()但它没有在OSX上实现,所以有更好更便携的方式,还是必须在不同的系统上实现不同的代码?我也不确定fdatasync()是否足够好。
当然,在最糟糕的情况下,我可能会忘记这一点,并使用一个使用ACID存储数据的冗余数据库。我不希望这样。
此外,我对如何确保截断和重命名操作已经完成感兴趣。
谢谢!
答案 0 :(得分:6)
您正在寻找同步。有一个名为sync的程序和一个名为sync(man 1 sync
和man 2 sync
的系统调用):
#include <unistd.h>
void sync(void);
DESCRIPTION
sync() first commits inodes to buffers, and then buffers to disk.
因此,它将确保所有挂起的操作(截断,重命名等)实际上写入磁盘。
fsync
并未声明刷新所有输出缓存,而是声称将对特定文件描述符的所有更改刷新到磁盘。它明确地不确保更新目录条目(在这种情况下,需要在目录的filedescriptor上调用fsync)。
fsyncdata
更加无用,因为它不会刷新文件元数据,而只会确保刷新文件中的数据。
信任联机帮助页是个好主意。我不会说没有错误,但它们往往非常准确。