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

调用fsync()能否等待libaio异步文件写操作全部完成?

问题解答

关于fsync()能否等待所有libaio写入完成的问题

答案是不可以,分两种常见使用场景说明:

  • 未开启O_DIRECT的libaio写入:fsync仅会将当前已经写入内核页缓存的脏数据持久化到磁盘,不会等待尚未完成的异步写入请求执行完毕。此时你直接覆写用户态内存,可能会导致内核正在进行的用户态到页缓存的数据拷贝过程拿到错误内容。
  • 开启O_DIRECT的libaio写入:IO请求绕开页缓存直接和磁盘交互,fsync对未完成的O_DIRECT异步写入没有等待逻辑,覆写内存时仍然可能出现正在进行的IO读取到错误数据的问题。

符合需求的一行式解决方案

libaio原生提供了批量等待所有请求完成的能力,你只需要调用io_getevents即可,核心代码示例如下:

// 变量说明:
// ctx: 你初始化的libaio上下文(io_context_t类型)
// total_write_reqs: 你之前提交的写入请求总数量
struct io_event event_buf[total_write_reqs];
// 下面这行调用会阻塞,直到所有提交的写入请求全部完成
int res = io_getevents(ctx, total_write_reqs, total_write_reqs, event_buf, NULL);

上述调用的第二个参数指定了最少要等待完成的请求数,和第三个参数的最大请求数设为相同值时,就会阻塞到所有指定数量的请求全部执行完毕,完全匹配你的需求。

关于aio_fsync的补充说明

手册的描述是准确的,aio_fsync本身只是提交一个异步的持久化请求,不会阻塞等待执行完成。就算你后续等待这个aio_fsync请求执行完毕,也不能保证你之前提交的异步写入请求已经全部跑完,因此不适合用来解决你的场景问题。

内容的提问来源于stack exchange,提问作者bob.sacamento

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:27:03