目的
只用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