为什么我要在一个全新的套接字上获得EPOLLHUP事件

时间:2013-02-08 03:27:13

标签: c linux sockets epoll

我有一些代码,当在虚拟机上运行时出于某种原因行为不端。

初始化的顺序是:

s_listen = socket(...)
bind(s_listen, ...)
epoll_ctl(epfd, EPOLL_CTL_ADD, s_listen, ...)
listen(s_listen, SOMAXCONN)

在调用bind之前,epoll文件描述符上有一个事件循环/线程正在运行和处理事件。

该事件循环在新创建的s_listen套接字上调用listen()之前获取EPOLLHUP。

所以我的问题是,为什么我要在一个全新的套接字上获得EPOLLHUP事件?

当我在调用listen()之后放入epoll_ctl时,错误消失了,但是如果在将套接字添加到epoll之前它们进入,会导致一些潜在的连接事件被错过吗?

1 个答案:

答案 0 :(得分:3)

正如我在评论中的示例所示,在正确初始化套接字之前,您似乎无法轮询套接字,除非您要处理EPOLLHUP

至于问题,不,你不会错过任何事件。调用listen()然后调用epoll()与您必须执行的操作相同(listen() +阻止accept());这些调用之间的实际传入连接由内核处理,并等待代码处理它们。