c - 如何在 sync/fsync/syncfs 到可移植设备后确保数据完整性

标签 c linux io

根据 sync 手册页,不能保证调用 sync 后光盘会刷新其缓存: “根据标准规范(例如 POSIX.1-2001),sync() 会安排写入,但可能会在实际写入完成之前返回。但是,由于版本 1.3.20 Linux 实际上会等待。(这仍然没有保证数据完整性:现代磁盘有大缓存。)“

而且,在fsync手册中,没有提到这一点。

有没有办法确保在调用 sync 后所有写入磁盘尤其是可移植设备 (USB) 的操作已完成?我遇到过调用sync/fsync后数据和元数据信息还没有完全写入光盘的情况。 我很好奇windows/linux中的“Safely remove device”怎么知道所有的数据都已经被设备自己完全写入了。

最佳答案

I am curious how "Safely remove device" in windows/linux knows that all data has been fully written by the device itself.

对于 IXish 系统:

使用 umount command 卸载 USB 设备的分区或 umount() system call .


blockdev --flushbufs

可能会刷新设备的缓冲区,但不会阻止任何人再次访问设备并重新填充缓冲区。


/proc文件系统中也有这个内核接口(interface):

/proc/sys/vm/drop_caches

可用于刷新不同的缓冲区:

逐字记录来自 https://www.kernel.org/doc/Documentation/sysctl/vm.txt

[...]

To free dentries and inodes:

  echo 2 > /proc/sys/vm/drop_caches

[...]

关于c - 如何在 sync/fsync/syncfs 到可移植设备后确保数据完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709080/

相关文章:

c - 如何阻止 GCC 在 snprintf() 调用中提示 "directive output may be truncated"?

linux - 将运行时日志存储在文件夹中

java - 为什么有人会在 PRIVATE 模式下使用内存映射文件?

c 使用 fgets、strtok 读取文件导致段错误

c - C 中的内存分配测试 - 如何为 malloc 和 free 编写 CUnit 测试?

c - 如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊?

c - 哪个C单元测试框架?

Linux:查找链接到特定目录的所有软链接(soft link)

c++ - 如何在 Raspbian C++ 项目上修复 "include"libvlc 和 sdl1.2?

java - 为什么 try/catch block BufferedWriter 需要括号