POSIX保证写入磁盘

Mat*_*ell 1 c io file-io storage posix

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

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

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

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

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

谢谢!

jmh*_*jmh 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.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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