繁体   English   中英

Perl-与fork / exec'd进程进行通信

[英]Perl - Communicating with a fork/exec'ed process

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

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

在分派四位经理之前,我很想创建一个管道。 管理器准备就绪后,可以将其PID写入管道并关闭。 主服务器可以延迟打开其侦听端口,直到至少一个管理器指示它准备就绪为止。 如果在所有管理人员都报告准备好就职前从管道中获得EOF,则它知道至少一名管理人员无法启动,并且可以采取适当的措施(日志错误并退出?)。 写入管道的消息通常被原子处理。 也就是说,如果消息足够短,则一个进程写的内容将不会与另一进程写的内容交错。

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

可以使用许多其他IPC机制,每种机制都有其自己的优点和缺点。 在很大程度上取决于管理者需要与主控者进行通信的内容(以及主控者是否需要与特定管理者进行通信)。 可以肯定使用套接字。 消息队列也可以。 如果您的通信需求很简单,则可以使用信号灯集。 而这样的例子不胜枚举。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM