epoll集合中fd与关联状态的映射

Posted

技术标签:

【中文标题】epoll集合中fd与关联状态的映射【英文标题】:Mapping between fd and associated state in epoll set 【发布时间】: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。 【参考方案1】:

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

回顾一些旧的技术论坛,同样的问题在一个名为Clumsy interface of epoll 的帖子中引起了广泛的讨论。基本上,尽管提出了EPOLL_CTL_GET 接口作为一种可能的解决方案,但无论如何都需要将映射保留在用户空间代码中。

虽然在线程中没有明确提及原因,但要考虑注册描述符的一件事是,如果描述符关闭,注销会自动发生。 不幸的是,没有“描述符”从epoll_wait 唤醒。

我看到EPOLL_CTL_GET 接口被假设为将events 参数非const 留在线程epoll_ctl and const correctness 中的原因。

Assuming all its duplicates are closed as well.

【讨论】:

感谢您的链接。这是一本有趣而有趣的读物。我很高兴看到我不是第一个提出这个问题的人。出于好奇,您是如何找到电子邮件线程的?我在发布问题之前尝试过谷歌搜索,但也许我的 google-fu 不够好。 我最初评论说你可以提议EPOLL_CTL_GET,但后来我搜索了它是否曾经提出过。

以上是关于epoll集合中fd与关联状态的映射的主要内容,如果未能解决你的问题,请参考以下文章

IO复用 select epoll

select poll和epoll区别

hibernate的映射之三(多对多单向关联)

slect( )poll( )epoll( )函数详解

hibernate的映射之四(多对多双向关联)

IO复用一select, poll, epoll用法说明