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
相关产品推荐
相关产品推荐

