linux c ++:从不调用libaio回调函数?

时间:2017-03-07 08:17:04

标签: c++ linux events callback aio

我使用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?那么如何修复我的程序,使其按预期工作?感谢。

1 个答案:

答案 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/)。