据我所知,如果我想将数据同步到存储设备,我可以使用fsync()来刷新所有操作系统输出缓存但显然它根本不能保证这一点,不像文档试图欺骗您,而且数据可能不会写入磁盘!
这在许多方面不是很好,因为它可能导致数据损坏。如何使用POSIX库(如果可能的话,以可移植的方式)来保证数据已被写入(尽可能)并防止数据损坏?
有fdatasync(),但它不是在OSX上实现的,那么是否有更好、更可移植的方法,或者必须在不同的系统上实现不同的代码我也不确定fdatasync()是否足够好。
当然,在最坏的情况下,我可能会忘记这一点,使用一个冗余的数据库库来使用ACID来存储数据。我不想那样。
另外,我感兴趣的是如何确保truncate和rename操作绝对已经完成。
谢谢!
最佳答案
你正在寻找同步。有一个名为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
不声明刷新所有输出缓存,而是声明将对特定文件描述符的所有更改刷新到磁盘。它显式地不能确保目录条目被更新(在这种情况下,需要对目录的文件描述符调用fsync)。fsyncdata
甚至更无用,因为它不会刷新文件元数据,而只会确保刷新文件中的数据。信任手册页是个好主意。我不会说没有错误,但它们往往非常准确。