【发布时间】:2017-01-10 10:00:33
【问题描述】:
当你添加一个 fd 到一个 epoll 集合时,你可以通过使用 'struct epoll_event.data' 来关联一些状态。当 epoll 在 fd 上报告一个事件时,它当然会将关联的数据与事件一起返回给用户。这意味着 epoll 集正在维护 fds 和关联状态之间的映射。
假设我将 epoll_event.data.ptr 设置为我动态分配的某个状态,并且在将来的某个时间点,我想从 epoll 集中删除 fd,从而释放我之前在 ptr 中设置的内存。
据我所知,没有任何编程方式可以让我在 epoll 集中查找与 fd 关联的状态来完成上述操作。我目前正在维护我自己的 fds 和关联状态之间的映射。我知道维护此映射不需要太多内存,但我仍然觉得在两个不同的地方维护相同的映射效率不是很高。
所以我的问题是:有没有办法检索与 epoll 集中的 fd 关联的状态?
【问题讨论】:
-
您可以保留自己添加到 epoll 集中的状态副本。每次触发事件时,您也可以将其从本地副本中删除,从而使两者保持同步。
-
你能直接关闭你想删除的 fd,然后让 epoll_wait 以 ERR/HUP/INVAL 状态返回你的 fd 和你的数据吗?
-
好主意,但是我不想关闭 fd。我需要使用电平触发,在某些情况下,我不在乎 fd 是否可读。我将尝试重新设计我的逻辑,这样我就不必从 epoll 集中删除 fd。