目的

只用get_events()因为无法知道当前已经完成的IO的数量,会出现盲目重试或者重试太慢的情况。为此,需要及时知道已经完成的IO的数量。通过epoller 事件通知机制可以解决这个问题。

实现过程

通过内核的event poll 机制实现:

构造eventfd记录完成的io event数量

 efd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
    if (efd == -1) {
        perror("eventfd");
        return 2;
    }

关联evnetfd与ioctx

io_set_eventfd(&iocbp->iocb, efd);

创建epoll

epfd = epoll_create(1);
    if (epfd == -1) {
        perror("epoll_create");
        return 7;
    }

关联eventfd 与epoll

    epevent.events = EPOLLIN | EPOLLET;
    epevent.data.ptr = NULL;
    if (epoll_ctl(epfd, EPOLL_CTL_ADD, efd, &epevent)) {
        perror("epoll_ctl");
        return 8;
    }

通过epoll查询完成的event数量

        uint64_t finished_aio;


        if (epoll_wait(epfd, &epevent, 1, -1) != 1) {
            perror("epoll_wait");
            return 9;
        }


        if (read(efd, &finished_aio, sizeof(finished_aio)) != sizeof(finished_aio)) {
            perror("read");
            return 10;
        }

示例

参考

https://zhuanlan.zhihu.com/p/40572954
https://zhuanlan.zhihu.com/p/258464210