【问题标题】:what's the best way to remove fd from epoll in my case?在我的情况下,从 epoll 中删除 fd 的最佳方法是什么?
【发布时间】:2014-01-21 10:43:34
【问题描述】:

在我的例子中,两个epoll_wait循环(两个线程)中使用了相同的fd(socket),一个循环仅用于读取(pollin),另一个循环仅用于写入(pollout),pollout仅在以下情况下启用我有数据要写。通常,当套接字被对等方关闭时,pollin首先接收,有没有最简单的方法来通知写循环来触发pollout或pollerr事件(做一些干净的工作并从epoll中删除fd)?在套接字被对等方关闭后,我尝试直接从读取循环中 epoll_ctl(EPOLLOUT),但它仅适用于某些系统。我还考虑添加 timerfd 来通知写循环。

【问题讨论】:

    标签: sockets epoll


    【解决方案1】:

    只需关闭套接字 fd。它会自动从 epoll 中注销自己。去年我问了一个类似的问题,得到了这个答案:

    Is it necessary to deregister a socket from epoll before closing it?

    如果您需要对该套接字的写入线程进行额外的清理,只需让您的写入线程也监听管道 fd 的读取端。通过向管道写入一个单字节来通知该线程(但不是在将消息排队到线程安全消息队列中指示要清理的详细信息之前)。

    当epoll_wait在管道上返回指示数据时,从管道中读取字节,消费队列上的消息,并做适当的清理工作。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2022-08-12
      相关资源
      最近更新 更多