3

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

4

1 回答 1

1

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

于 2013-01-01T09:10:34.573 回答