3.13 sync 族函数的区别

Caution

应当参考 13 文件输入输出缓冲,当前文件中有些内容可能是有错误的。

syncfs(int fd) 是 Linux 特有。sync / fsync / fdatasync 是 POSIX 标准。

函数功能返回时是否完成写入?
POSIXBSDLinux
fsync(int fd)写入磁盘。不保证含糊不清保证
fdatasync(int fd)写入数据到磁盘,不保证属性被写入。不保证含糊不清保证
sync(void)发起写入磁盘请求。不保证不保证保证?
syncfs(int fd)发起写入磁盘请求。\\不保证

fsyncfdatasync 的保证性比 sync 更强。受接口限制,在想要保证写入时只能选择它们。

按照 Hacker News 帖子 的说法,BSD 上不少厂商是没有做到 fsync 返回时数据已写入的保证的,比如 macOS。

关于 sync:书上说名为 update 的内核进程一般每 30s 调用一次 sync 来进行数据同步,但是我没找到 update 进程。FreeBSD 上是有 syncer 内核进程来做这件事。~~Linux 上的没找到对应的概念,可能有更加精细的控制方式。~~Linux 使用的是内核线程(而不是进程)实现的,2.4 版本中这个内核线程叫做 kupdated,2.6 版本中这个内核线程叫做 pdflush。