epoll set中fd和associated state的映射

Mapping between fd and associated state in epoll set

当你将一个 fd 添加到一个 epoll 集时,你可以使用 'struct epoll_event.data' 将一些状态与它关联起来。当epoll在fd上报告一个事件时,它当然会returns将关联的数据连同该事件一起提供给用户。这意味着 epoll 集正在维护 fds 和关联状态之间的映射。

假设我正在将 epoll_event.data.ptr 设置为我动态分配的某个状态,并且在将来的某个时候,我想从 epoll 集中删除 fd 并因此释放我在 ptr 中设置的内存更早。

据我所知,我没有任何编程方式来查找与 epoll 集中的 fd 关联的状态来完成上述操作。我目前正在维护我自己的 fds 和关联状态之间的映射。我知道维护这个映射不需要太多内存,但我仍然觉得在两个不同的地方维护相同的映射效率不高。

所以我的问题是:有没有办法检索与 epoll 集中的 fd 关联的状态?

不,无法按需检索状态。仅当描述符有 epoll_wait 唤醒时才会返回相关状态。

回顾一些旧的技术论坛,同样的问题在标题为 Clumsy interface of epoll 的话题中有明显的争论。基本上,有人认为无论如何都非常需要在用户 space 代码中保留映射,尽管提出了 EPOLL_CTL_GET 接口作为可能的解决方案。

虽然线程中没有明确提到原因,但关于已注册的描述符需要考虑的一件事是,如果关闭描述符,则会自动取消注册。 不幸的是, epoll_wait 没有 "descriptor was implicitly deregistered" 唤醒。

我看到 EPOLL_CTL_GET 接口被假定为在线程 epoll_ctl and const correctness.[=19= 中保留 events 参数非 const 的原因]

Assuming all its duplicates are closed as well.