接收孩子的事件

时间:2013-01-01 08:12:56

标签: sockets select fork epoll libev

我正在使用libev编写tcp服务器。 我在listen()之后创建套接字和分叉,然后在侦听套接字上启动一个libev读取观察器并在观察者回调中接收客户端连接。 可能是这种情况,当两者:子和父(或两个子,如果有多个)接收到监听套接字变得可读的事件,并且都将尝试accept()客户端连接,在这种情况下,一个进程将阻止? 我写了测试程序,似乎只有一个进程接收到就绪事件,但也许我错了?在这种情况下,我可以在哪里阅读系统行为?内核如何在进程之间进行负载均衡并决定谁将接收事件?是后端(选择,epoll等......)和/或OS特定的?

1 个答案:

答案 0 :(得分:1)

很可能两个进程都会从套接字接收到就绪指示,并且两者都将作为结果调用accept()。这就是为什么你应该总是将非阻塞文件描述符与基于事件的API一起使用的原因之一,例如socket()poll()epoll()kqueue()(或libev,它提供了这些中的一个或多个的抽象)。如果你使用非阻塞套接字,那么一个孩子将从accept()得到一个成功的结果,所有其他人将得到一个EAGAIN,忽略它,然后回去睡觉而不会造成伤害。