在我的案例中,从epoll中删除fd的最佳方法是什么?

时间:2014-01-21 10:43:35

标签: sockets epoll

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

1 个答案:

答案 0 :(得分:2)

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

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

如果你需要在这个套接字的写线程上做额外的清理工作,那么让你的写线程也听取管道fd的读端。通过向管道写入单字节来通知此线程(但不是在将消息排队到线程安全消息队列之前,而不是在指示要清理的内容的详细信息之前)。

当epoll_wait返回指示管道上的数据时,读取管道上的字节,使用队列中的消息,并进行适当的清理工作。

希望这有帮助。