【问题标题】:Questions about epoll and the data struct关于 epoll 和数据结构的问题
【发布时间】:2018-12-07 21:42:42
【问题描述】:

在 epoll 事件 event.data.fd 中返回的 fd 是否会在每次使用 epoll_wait() 之间始终保持相同的 fd 描述符,并且可以用它来识别每次连接以及与之关联的状态。

【问题讨论】:

  • 如果您轮询多个 FD,event.data.fd 可以是其中任何一个。它将是任何一个已经准备好的。
  • 听起来您并不真正了解epoll 工作原理的基础知识。当然,FD 会识别连接,它与您用来发送/接收的 FD 相同。
  • man7.org/linux/man-pages/man7/epoll.7.html有一个例子展示了它是如何使用的
  • 但是如果 epoll 例如 dup2 的 fd 换成不同的 fd,fd 的确切值会改变吗?特定连接对应的fd的值是否可以随着epoll而改变?
  • 我不确定到底会发生什么,但是一些网页警告不要使用带有epoll 的复制描述符,因为轮询与底层文件描述相关联。但是手册页中的常见问题解答表明,如果您在每个 FD 上有不同的投票掩码,这也很有用。

标签: c epoll


【解决方案1】:

文档非常清楚地解释了这一点:

每个返回结构的数据字段包含与在最近调用epoll_ctl(2)(EPOLL_CTL_ADDEPOLL_CTL_MOD)中指定的相同数据,以获取相应的打开文件描述。

因此,event.data.fd 的返回值将是您在上次调用 epoll_ctl 时为该打开文件描述指定的任何值。除非你弄乱了forkdup,并且在两个描述符上都使用了epoll,否则这将是对该文件描述符的最后一次调用epoll_ctl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2011-09-12
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多