我正在使用多线程嵌入式应用程序,其中epoll用于其中一个线程中的IO。我依赖于epoll的一个特殊功能,它指定关闭文件描述符会自动将其从epoll集中删除(man 7 epoll中的问题/答案6)。在这种情况下,文件描述符close在调用epoll_wait
的同一线程中完成。最终发生的事情是epoll_wait
在文件描述符关闭后返回一个事件并且程序最终崩溃,因为它试图访问在文件描述符关闭时被释放的资源。据我所知,文件描述符不会被欺骗,但我不知道如何验证这一点。我知道事实上没有使用特定的dup选项调用fork()
,dup()
,dup2()
或fcntl()
。此特定文件描述符已在EPOLLOUT
,EPOLLIN
,EPOLLERR
和EPOLLHUP
中注册。它是由水平触发的。这个功能是否有任何人都知道的注意事项?手册页不正确吗?任何有用的信息可以帮助我进一步调试问题?我知道我可以从集合中删除文件描述符,但我想知道为什么会发生这种情况。
答案 0 :(得分:2)
关闭文件描述符似乎不会从epoll中删除它。我在3.12.2上用非常简单的例子试了一下。我倾向于将手册页称为错误或不准确。
我在测试中所做的是:
即使套接字已经关闭,无论我是否已连接它,等待仍然有效。
编辑:如果套接字已关闭,The epoll_ctl_del
确实失败了。在阅读了当前的手册之后,看起来它们确实没问题。 epoll页面指向选择(2)关闭正在监视的套接字,该页面表明行为未指定。