您的位置:首页 > 大数据 > 人工智能

用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux libaio