3.13 sync 族函数的区别
Caution
应当参考 13 文件输入输出缓冲,当前文件中有些内容可能是有错误的。
syncfs(int fd)
是 Linux 特有。sync
/ fsync
/ fdatasync
是 POSIX 标准。
函数 | 功能 | 返回时是否完成写入? | ||
---|---|---|---|---|
POSIX | BSD | Linux | ||
fsync(int fd) | 写入磁盘。 | 不保证 | 含糊不清 | 保证 |
fdatasync(int fd) | 写入数据到磁盘,不保证属性被写入。 | 不保证 | 含糊不清 | 保证 |
sync(void) | 发起写入磁盘请求。 | 不保证 | 不保证 | 保证? |
syncfs(int fd) | 发起写入磁盘请求。 | \ | \ | 不保证 |
fsync
和 fdatasync
的保证性比 sync
更强。受接口限制,在想要保证写入时只能选择它们。
按照 Hacker News 帖子 的说法,BSD 上不少厂商是没有做到 fsync
返回时数据已写入的保证的,比如 macOS。
关于 sync
:书上说名为 update 的内核进程一般每 30s 调用一次 sync
来进行数据同步,但是我没找到 update 进程。FreeBSD 上是有 syncer 内核进程来做这件事。~~Linux 上的没找到对应的概念,可能有更加精细的控制方式。~~Linux 使用的是内核线程(而不是进程)实现的,2.4 版本中这个内核线程叫做 kupdated,2.6 版本中这个内核线程叫做 pdflush。