背景
多进程单线程epoll程序,惊群问题是绕不开的,即使内核替你解决了accept的惊群问题,epoll的还是需要用户自己解决,这个事情不应该由内核管,它也管不了。
我在测试中发现,epoll_create的创建工作,一定要在fork之后,否则就出现串线现象,就是a进程accept后新建的socket连接,等到下次触发in事件时,就串到b进程中了,这个很好测试,可以先开两个进程,挂载上去一试便知。
后来我把epoll_create的位置放在fork之后,发现没有这个现象了
分析
为什么会有这个现象?
其实我真的没有想明白,我即使是在fork之前创建,可是fork之后,子进程是复制了父进程的资源,那么对应的epoll句柄也应该是复制的啊,现在出现了串线现象,说明子进程并不是复制了父进程的资源,而是共享了父进程的资源。