【发布时间】:2013-01-23 18:49:03
【问题描述】:
我有一些代码在虚拟机上运行时由于某种原因行为异常。
初始化顺序为:
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之前进入,是否会导致错过一些潜在的连接事件?
【问题讨论】:
-
我已经有一段时间没有使用民意调查和朋友了,但我不记得在正确设置之前向民意调查集添加过 fd(即,在调用
accept、@987654325 之后) @ 或listen)。你确定给一个epoll set添加一个未初始化的socket是有效的吗? -
绝对有效。您甚至可以在连接/绑定/接受之前添加任何有效的套接字。
-
This code 打印:“事件:err=0,hup=16”。所以你真的确定它是有效的吗? (好吧,我猜 POLLHUP 是有效的,但你明白我的意思。)
-
该链接将我带到“未知的过去bin id”。无论如何,改变事物的顺序并过滤事件正确地解决了它。
-
我已将到期时间设置为 1 天;我重新上传了它here,现在过期了 1 个月。