我看到epoll_wait()了监听器套接字之间的以下交互。创建侦听器套接字的事件顺序是:
- 称呼
socket() - 称呼
bind() - 调用
fcntl()并设置为非阻塞 - 打电话
epoll_ctl()和EPOLL_CTL_ADD_EPOLLET | EPOLLONESHOT | EPOLLIN - 称呼
listen()
有后台线程调用epoll_wait()此套接字和其他线程,如果碰巧在第 4 步和第 5 步之间这样做,EPOLLHUP则为侦听器套接字接收一个事件。将顺序更改为:
- 称呼
socket() - 称呼
bind() - 调用
fcntl()并设置为非阻塞 - 称呼
listen() - 打电话
epoll_ctl()和EPOLL_CTL_ADD_EPOLLET | EPOLLONESHOT | EPOLLIN
解决了这个问题,但现在我看到了建立连接EPOLLIN但未收到侦听器套接字的事件的虚假故障。
我知道可以选择使用电平触发模式,但我想让它适用于边缘触发模式。
关于这个问题可能是什么的任何想法?