用libaio读写文件时遇到的问题
2015-06-04 23:45
357 查看
最近做了一些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 返回后,read eventfd,当read的返回值大于0时,调用io_queue_run。
这个接口已经不多见,这个接口的参数就是io_setup时的第二个参数ctx,即io_queue_run(ctx),他的作用就是触发io_set_callback注册的回调函数。
libaio、epoll、eventfd结合使用的例子可以参考:
http://blog.chinaunix.net/uid-16979052-id-3840266.html
碰到了一个问题,就是用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 返回后,read eventfd,当read的返回值大于0时,调用io_queue_run。
这个接口已经不多见,这个接口的参数就是io_setup时的第二个参数ctx,即io_queue_run(ctx),他的作用就是触发io_set_callback注册的回调函数。
libaio、epoll、eventfd结合使用的例子可以参考:
http://blog.chinaunix.net/uid-16979052-id-3840266.html
相关文章推荐
- Linux socket 初步
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量
- Linux下修改MySQL编码的方法