c - POSIX 保证写入磁盘

标签 c file-io io posix storage

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

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

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

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

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

谢谢!

最佳答案

您正在寻找同步。有一个名为 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 更加无用,因为它不会刷新文件元数据,而只会确保文件中的数据被刷新。

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

关于c - POSIX 保证写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201808/

相关文章:

python - 我的 CSV 编写器代码在字符之间写入分隔符而不是字符串

java - PushBackInputStream和DataInputStream,如何推回一个double?

java - 在 Java 中获取文件/目录所有者的名称

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

c - 为什么memset在函数上的工作方式不同?

c - 字符串操作,以下函数的作用是什么?

c - 在 C 中通过管道将一个命令的输出作为另一个命令的输入

c - FILE 结构中未使用的变量

追加后PHP文件大小不变

python - 打开时不读取文件的最后一 block