Epoll_wait在关闭的文件描述符上返回事件

时间:2013-11-26 16:05:10

标签: c++ linux epoll

我正在使用多线程嵌入式应用程序,其中epoll用于其中一个线程中的IO。我依赖于epoll的一个特殊功能,它指定关闭文件描述符会自动将其从epoll集中删除(man 7 epoll中的问题/答案6)。在这种情况下,文件描述符close在调用epoll_wait的同一线程中完成。最终发生的事情是epoll_wait在文件描述符关闭后返回一个事件并且程序最终崩溃,因为它试图访问在文件描述符关闭时被释放的资源。据我所知,文件描述符不会被欺骗,但我不知道如何验证这一点。我知道事实上没有使用特定的dup选项调用fork()dup()dup2()fcntl()。此特定文件描述符已在EPOLLOUTEPOLLINEPOLLERREPOLLHUP中注册。它是由水平触发的。这个功能是否有任何人都知道的注意事项?手册页不正确吗?任何有用的信息可以帮助我进一步调试问题?我知道我可以从集合中删除文件描述符,但我想知道为什么会发生这种情况。

1 个答案:

答案 0 :(得分:2)

关闭文件描述符似乎不会从epoll中删除它。我在3.12.2上用非常简单的例子试了一下。我倾向于将手册页称为错误或不准确。

我在测试中所做的是:

  • 创建了一个tcp套接字
  • 将其绑定到localhost:5555
  • 设置为听
  • 创建了一个epoll
  • 在那里用hup,err和
  • 添加了套接字
  • 睡了一下,所以我可以选择与nc
  • 连接
  • 关闭了套接字
  • epoll_wait
  • epoll_ctl del
  • 清理

即使套接字已经关闭,无论我是否已连接它,等待仍然有效。

编辑:如果套接字已关闭,The epoll_ctl_del确实失败了。在阅读了当前的手册之后,看起来它们确实没问题。 epoll页面指向选择(2)关闭正在监视的套接字,该页面表明行为未指定。