假设我通过调用创建 epoll 文件描述符(epfd)
epfd = epoll_create( 10 );
Run Code Online (Sandbox Code Playgroud)
接下来,我通过调用 epoll_ctl(epfd,EPOLL_CTL_ADD,...) 将一些文件描述符添加到该集合中,并通过在单独的线程中调用 epoll_wait 来等待事件循环中的事件。
如果我在 epoll 设置不为空并且 epoll_wait(epfd,...) 正在进行时关闭 epfd(通过在线程中调用 close(epfd),然后是 epoll_wait 线程)会发生什么?epoll_wait是否终止?结果如何?
可以预见的是,Linux 所做的事情与select(2). 从手册页:
有关如果正在监视的 epoll 实例中的文件描述符
epoll_wait()在另一个线程中关闭可能会发生什么情况的讨论,请参阅select(2)。
并从select(2)页面:
如果正在监视的文件描述符
select()在另一个线程中关闭,则结果未指定。[...]在Linux(和其他一些系统)上,关闭另一个线程中的文件描述符对select()
tl;博士; 是“不要这样做”:
总之,在此场景中依赖特定行为的任何应用程序都必须被视为有错误。