2013-01-01 62 views
3

我正在使用libev编写tcp服务器。 我在listen()之后创建socket和fork,然后在侦听套接字上启动一个libev读取监视器,并在watcher回调中接收客户端连接。 可能是这样的情况,当两者:孩子和父母(或两个孩子,如果有多个孩子)收到事件,即监听套接字变得可读并且都会尝试accept()客户端连接,在这种情况下,其中一个进程会阻塞? 我编写的测试程序,似乎只有一个进程收到准备好的事件,但也许我错了?在这里我可以阅读关于系统行为的地方?内核如何在进程之间进行负载均衡并决定谁将接收事件?它是后端(select,epoll等)和/或操作系统特定的?在childs中接收事件

回答

1

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

+0

使用非阻塞套接字是个好主意,谢谢 – user1940679