当 epoll 文件描述符关闭时会发生什么?

k.o*_*.o. 6 epoll

假设我通过调用创建 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是否终止?结果如何?

cni*_*tar 6

可以预见的是,Linux 所做的事情与select(2). 从手册页:

有关如果正在监视的 epoll 实例中的文件描述符epoll_wait()在另一个线程中关闭可能会发生什么情况的讨论,请参阅select(2)

并从select(2)页面:

如果正在监视的文件描述符select()在另一个线程中关闭,则结果未指定。[...]在Linux(和其他一些系统)上,关闭另一个线程中的文件描述符对select()

tl;博士; 是“不要这样做”:

总之,在此场景中依赖特定行为的任何应用程序都必须被视为有错误