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