You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

fsync() 应在 write() 调用之前还是之后执行?

关于fsync()与write()的调用顺序问题

先明确两者的核心作用:

  • write():把用户空间的数据拷贝到内核的页缓存(也就是你说的内核缓冲区),这一步完成后数据还没真正落到磁盘,内核会根据自身的优化策略(比如延迟写入、合并批量写入)在后续时机刷盘。
  • fsync():强制将指定文件描述符对应的内核页缓存数据同步到磁盘,确保数据真正持久化。

所以调用顺序必然是先执行write(),再执行fsync():

  • 如果先调用fsync(),此时内核缓冲区里还没有你要写入的目标数据,这个调用完全没有实际意义,只是做了一次无价值的磁盘同步操作。
  • 先调用write()把数据放到内核缓冲区后,再调用fsync(),才能确保这次write()产生的数据被强制刷到磁盘,达到你想要的持久化效果。

给个简单的代码示例:

int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);
if (fd == -1) {
    // 处理打开文件错误
}
const char* content = "要写入的内容";
ssize_t write_len = write(fd, content, strlen(content));
if (write_len == -1) {
    // 处理写入错误
}
// 同步write的数据到磁盘
if (fsync(fd) == -1) {
    // 处理同步错误
}
close(fd);

额外补充:如果只需要确保文件数据同步,不需要同步文件元数据(比如修改时间、文件大小),可以用fdatasync(),它的性能比fsync()略好——因为fsync()会同时同步数据和元数据,而fdatasync()只处理数据部分。

内容的提问来源于stack exchange,提问作者Neeraj Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:24:25