Perl - 与fork / exec'ed进程通信

时间:2012-12-27 04:05:18

标签: perl exec fork communication

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

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

2 个答案:

答案 0 :(得分:1)

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

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

可以使用许多其他IPC机制,每种机制都有自己的优点和缺点。很大程度上取决于管理者需要与主人沟通的内容(以及主人是否需要与特定经理沟通)。插座可以肯定使用;消息队列也是如此。如果您的通信需求很简单,那么信号量集可能会起作用。名单还在继续。

答案 1 :(得分:0)

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