我使用g ++ 6.2进行ubuntu 16.10,测试libaio功能:
1. I was trying to test io_set_callback() function
2. I was using main thread and a child thread to talk by a pipe
3. child thread writes periodically (by alarm timer, signal), and main thread reads
我希望使用“回调”功能来接收通知。它没有按预期工作:从不调用回调函数“read_done”
我的问题:
1. I expected my program should call "read_done" function, but actually not.
2. Why the output prints 2 "Enter while" each time?
I hope it only print together with "thread write msg:..."
3. I tried to comment out "io_getevents" line, same result.
我不确定回调模式是否还需要io_getevents?那么如何修复我的程序,使其按预期工作?感谢。
答案 0 :(得分:2)
您需要将io_queue_run(3)
和io_queue_init(3)
集成到您的计划中。虽然这些并不是新功能,但它们似乎并不适用于当前发货的许多发行版的联机帮助页。这是一些联机帮助页:
http://manpages.ubuntu.com/manpages/precise/en/man3/io_queue_run.3.html http://manpages.ubuntu.com/manpages/precise/en/man3/io_queue_init.3.html
当然,联机帮助文件实际上并没有说出来,但是io_queue_run
会调用您在io_set_callback
中设置的回调。
更新:呃。以下是来自Centai / RHEL 上的libaio-0.3.109的io_queue_run
的来源(LGPL许可,版权所有2002 Red Hat,Inc。)
int io_queue_run(io_context_t ctx)
{
static struct timespec timeout = { 0, 0 };
struct io_event event;
int ret;
/* FIXME: batch requests? */
while (1 == (ret = io_getevents(ctx, 0, 1, &event, &timeout))) {
io_callback_t cb = (io_callback_t)event.data;
struct iocb *iocb = event.obj;
cb(ctx, iocb, event.res, event.res2);
}
return ret;
}
如果没有io_queue_wait
电话,你永远不想实际调用它。并且,io_queue_wait
调用在Centos / RHEL 6和7中包含的标题中被注释掉。我认为你不应该调用这个函数。
相反,我认为你应该将这个源合并到你自己的代码中,然后修改它来做你想要的。你可以非常简单地为这个io_queue_run
添加一个超时参数,只需用它替换你对io_getevents的调用,而不是打扰io_queue_wait
。这里甚至还有一个补丁,使io_queue_run更好:https://lwn.net/Articles/39285/)。