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

6
假设我通过调用以下方法创建epoll文件描述符(epfd):

epfd = epoll_create( 10 );

接下来,我通过调用epoll_ctl(epfd,EPOLL_CTL_ADD,...)将一些文件描述符添加到这个集合中,并通过在单独的线程中调用epoll_wait等待事件。

如果我在epoll集合不为空且正在进行epoll_wait(epfd,...)时关闭epfd(通过在线程中调用close(epfd)),会发生什么? epoll_wait终止吗?结果是什么?

1个回答

6
可预测的是,Linux对于select(2)所做的事情与其相同。从手册页面中可以看到:

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

而从select(2)页面中可以看到:

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

简而言之,就是“不要这样做”:

总之,任何依赖于此场景中特定行为的应用程序都必须被认为是有缺陷的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接