我有一个父进程,它创建 2 个服务器套接字并调用select()它们以等待新连接。当连接到达时,一条消息被发送到一个子进程(fork()在服务器套接字创建之后用 创建,所以它们是共享的)。
在这个孩子中,调用accept()服务器套接字不起作用。我收到一个EAGAIN错误(非阻塞套接字)。accept()而在主进程中调用则完美无缺。
当然,我根本不调用accept()主进程,我只是测试一下它是否有效,它确实有效。
为什么我不能在父进程中调用accept()子进程?select()
编辑:这里的目标是创建固定数量的工作人员(比如说 8 个)来处理客户端连接,就像在 prefork 模型中一样。这些连接将是长连接,不像 HTTP。目标是负载平衡工作人员之间的连接。
为此,我使用了一个共享内存变量,其中包含一个工作人员当前连接的客户端的数量。我想“询问”客户端数量最少的工作人员来处理新连接。
这就是为什么我select()在父进程中执行,然后向子进程发送消息,因为我想“选择”哪个进程将处理新连接。
服务器侦听多个套接字(一个用于 ssl,一个不用于),这就是我使用select()而不是直接accept()在子进程中使用的原因,因为我不能accept()在我的子工作者中使用多个套接字。