我有一些代码,当在虚拟机上运行时出于某种原因行为不端。
初始化的顺序是:
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之前它们进入,会导致一些潜在的连接事件被错过吗?
答案 0 :(得分:3)
正如我在评论中的示例所示,在正确初始化套接字之前,您似乎无法轮询套接字,除非您要处理EPOLLHUP
。
至于问题,不,你不会错过任何事件。调用listen()
然后调用epoll()
与您必须执行的操作相同(listen()
+阻止accept()
);这些调用之间的实际传入连接由内核处理,并等待代码处理它们。