首页 > linux fork epoll “惊群问题”

linux fork epoll “惊群问题”

一个主进程 fork 产生多个子进程,然后每个子进程使用epoll+recvfrom去获取数据(每个进程,都会先发送ICMP 请求,模拟ping操作),然而,在epoll_wait中,只要有一个socket可读,所有wait中的socket都被唤醒了,我检查过socket的值是一样的,但是我是在fork之后才申请socket描述符的,所以我感觉 我这个应该不是惊群问题吧。

具体情况如下:
1、主进程fork出来两个进程,其中每个进程都单独发送ICMP(两个进程的ICMP报文的IP地址都ping不通),然后每个进程同时用epoll去监听socket超时(超时时间为3s),这种情况下,两个进程都是epoll_wait等待超时了(这是正常的)
2、但是,如果我主进程fork出三个子进程,然后每个子进程都单独发送ICMP(其中两个ICMP报文填写的IP还是ping不通的,第三个是能ping通的IP),同样的每个进程都单独使用epoll去监听socket的超时(超时时间为3s),在这种情况下,三个进程的socket都变得可读,也就是说都收到了ICMP的回复报文,但是,真实情况不应该是只有第三个socket可读,另外两个3s后epoll_wait超时么?

首先epoll_wait只会监听被加入epoll_event的套接字和事件。
另外一个不同进程间的描述符相同不代表任何含义,因为他们的数据空间是独立的。
楼主现在使用的是icmp协议,不存在端口号的对比,所以所有在等待icmp消息的套接字都会收到这个icmp消息。
所以所有套接字都是可读的,并不是像楼主说的只有一个socket可读。
最后这个并不是资源的抢占,所以不是惊群现象


每个子进程都发送ICMP,得到响应,套接口可读是正常的啊

【热门文章】
【热门文章】