将epd添加到epoll集时,可以使用'struct epoll_event.data'将某个状态与它关联起来。当epoll在fd上报告事件时,它当然会将关联的数据与事件一起返回给用户。这意味着epoll集正在维护fds和相关状态之间的映射。
假设我将epoll_event.data.ptr设置为我动态分配的状态,并且在将来的某个时刻,我想从epoll集中删除fd,从而释放我之前在ptr中设置的内存。
据我所知,我没有一种编程方式可以在epoll集中查找与fd相关联的状态来完成上述操作。我目前正在维护自己在fds和相关状态之间的映射。我知道维护这种映射并不需要太多内存,但我仍然觉得在两个不同的地方维护相同的映射效率不高。
所以我的问题是:有没有办法检索与epoll集中的fd相关联的状态?
答案 0 :(得分:2)
不,没有办法按需检索状态。仅当描述符有epoll_wait
唤醒时才返回关联状态。
回顾一些旧的技术论坛,同样的问题在标题为Clumsy interface of epoll的主题中引起了极大的争议。基本上,有人认为无论如何都要保持用户空间代码中的映射,尽管提出了EPOLL_CTL_GET
接口作为可能的解决方案。
虽然在线程中没有明确提到它作为一个原因,但是关于注册描述符需要考虑的一件事是,如果描述符被关闭,则会自动发生注销。†不幸的是,没有&# 34;描述符被隐式注销"从epoll_wait
唤醒。
我看到假设EPOLL_CTL_GET
接口是将events
参数非const
留在线程epoll_ctl and const correctness中的理由。