最近做了一些libaio的读写文件的相关工作,是一个结合eventfd、libaio、epoll的程序。
碰到了一个问题,就是用io_submit提交io后,利用io_getevents获取完成的io操作数,结果不清楚为什么io_getevents一直返回错误码-14,利用strerror查看,提示Bad Address。
用man查看io_getevents说明,说是io_getevents的参数struct io_event *events, struct timespec *timeout是无效的,但是这两个参数确实是没有问题的,全是局部变量。
其实调用io_getevents一是获取完成的io操作,二是调用回调函数,代码示例如下:
tms.tv_sec = 0;
tms.tv_nsec = 0;
r = io_getevents(ctx, 1, NUM_EVENTS, events, &tms); //在我的程序中,此处的r一直是-14,回调函数一直无法调用
if (r > 0) {
for (j = 0; j < r; ++j) {
((io_callback_t)(events[j].data))(ctx, events[j].obj, events[j].res, events[j].res2);
}
}
既然目前问题无法解决,只能暂时回避一下。
不再调用io_getevents,而是当epoll_wait 返回后&#