我正在使用libev编写tcp服务器。 我在listen()之后创建套接字和分叉,然后在侦听套接字上启动一个libev读取观察器并在观察者回调中接收客户端连接。 可能是这种情况,当两者:子和父(或两个子,如果有多个)接收到监听套接字变得可读的事件,并且都将尝试accept()客户端连接,在这种情况下,一个进程将阻止? 我写了测试程序,似乎只有一个进程接收到就绪事件,但也许我错了?在这种情况下,我可以在哪里阅读系统行为?内核如何在进程之间进行负载均衡并决定谁将接收事件?是后端(选择,epoll等......)和/或OS特定的?
答案 0 :(得分:1)
很可能两个进程都会从套接字接收到就绪指示,并且两者都将作为结果调用accept()
。这就是为什么你应该总是将非阻塞文件描述符与基于事件的API一起使用的原因之一,例如socket()
,poll()
,epoll()
或kqueue()
(或libev,它提供了这些中的一个或多个的抽象)。如果你使用非阻塞套接字,那么一个孩子将从accept()
得到一个成功的结果,所有其他人将得到一个EAGAIN
,忽略它,然后回去睡觉而不会造成伤害。