1

我正在设计一个服务器,它将通过fork / exec 'ing 四个“管理器”(它们自己的服务器进程)进行初始化,然后接受来自客户端的连接,fork / exec 'ing “奴隶”与客户端进行通信。在它们的生命周期中,slave 将与管理器建立连接并向它们发送工作请求。

我的问题是关于启动管理器。每个都可能需要一些时间来初始化(几分钟),我不希望主服务器在初始化之前继续接受客户端。最好的方法是什么?我应该探索让经理在准备好后向主服务器发出信号吗?我是否应该让管理人员与主服务器建立套接字连接 - 可能在与客户端连接的端口不同的端口上 - 并在准备好时发送消息?或者是其他东西?

4

2 回答 2

1

在分叉四个管理器之前,我很想创建一个管道。当管理器准备好时,它可以将其 PID 写入管道并关闭它。主服务器可以延迟打开其侦听端口,直到至少有一个管理器表明它已准备好。如果它在所有管理器报告已准备好执行现役之前从管道中获取 EOF,那么它知道至少有一个管理器未能启动并且可以采取适当的措施(记录错误并退出?)。写入管道的消息通常被原子处理;也就是说,如果消息足够短,一个进程所写的内容不会与另一个进程所写的内容交错。

对于某些变体,您可以每个经理有一个管道;然后你必须决定你将如何轮询或选择哪个管道有消息等待。你可以决定经理们在表明他们已经准备好之后不关闭管道;他们可以保持打开状态,并在准备好时写入适当的“PID 准备就绪”,以及稍后的其他状态消息(“PID 退出”、“PID 太忙”、“PID 正在喝咖啡休息时间”……)。

还有很多其他的 IPC 机制可以使用,每一种都有自己的优点和缺点。很大程度上取决于管理者需要与主人沟通什么(以及主人是否需要与特定管理者沟通)。可以肯定使用套接字;消息队列也可以。如果您的通信需求很简单,信号量集可能会起作用。而这样的例子不胜枚举。

于 2012-12-27T06:54:34.050 回答
0

您正在考虑的是FIFO管道。mknod传统上用于创建它们。管道有2 个文件描述符,一个用于读取,一个用于写入......如果需要,它们可以阻止它......

于 2012-12-27T04:07:35.680 回答