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
的原因]
当你将一个 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
的原因]