我有一些代码在虚拟机上运行时由于某种原因出现异常。
初始化的顺序是:
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 之前进入,是否会导致错过一些潜在的连接事件?
最佳答案
正如我在评论中的示例所示,似乎您无法在套接字正确初始化之前对其进行轮询,除非您想处理 EPOLLHUP
。
至于问题,不,你不会错过任何事件。调用 listen()
然后调用 epoll()
与您在其他情况下必须执行的操作相同(listen()
+ 阻塞 accept( )
);这些调用之间的实际传入连接由内核处理并等待直到您的代码处理它们。
关于c - 为什么我在全新的套接字上收到 EPOLLHUP 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14765203/