1

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

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

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

当然,在最坏的情况下,我可能会忘记这一点并使用使用 ACID 来存储数据的冗余数据库库。我不想要那个。

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

谢谢!

4

1 回答 1

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

fsyncdata甚至更没用,因为它不会刷新文件元数据,而只会确保文件中的数据被刷新。

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

于 2012-11-02T19:37:08.253 回答