3

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

初始化顺序为:

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之前进入,会导致错过一些潜在的连接事件吗?

4

1 回答 1

4

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

至于问题,不,您不会错过任何活动。调用listen()thenepoll()与您必须执行的操作相同(listen()+ 阻塞accept());这些调用之间的实际传入连接由内核处理并一直等待直到您的代码处理它们。

于 2013-02-08T05:07:52.833 回答