【发布时间】:2023-03-23 03:01:01
【问题描述】:
我正在尝试处理如下工作的服务器:
- 它有一个父进程
- 它创建一个“帮助”子进程来处理一些特殊任务
- 它用管道打开子进程;并使用管道向孩子发出命令。
- 它还衍生出许多其他子进程(服务器的主要目标是执行各种命令)。
我希望能够检测到何时将管道写入子进程失败;并发出特别通知。
通常,我会通过在父进程中创建自定义 $SIG{PIPE} 处理程序来实现。
但是,我担心的是父进程启动以执行命令的某些进程可能有自己的管道对它们开放;如果写入 THOSE 管道失败,我想简单地忽略 SIGPIPE。
第一季度。有没有办法让我从 SIGPIPE 处理程序中分辨出哪个打开的管道发出了信号? (我知道每个孩子的 PID,所以 PID 就可以了……或者如果有办法通过文件描述符#s 来做到这一点?)。
第二季度。我可以以某种方式使用local $SIG{PIPE} 解决问题吗?我的假设是我需要:
- 在写入该管道之前设置 helper-process-specific
local $SIG{PIPE} - 做
print $HELPER_PIPE(这只发生在一个子程序中) - 将 $SIG{PIPE} 重置为
DEFAULT或IGNORE - 确保这 3 个操作在各自的块范围内。
【问题讨论】:
-
不确定你用什么来写命令,但如果写失败
perldoc -f syswrite,它应该不返回'undef',因为你也知道你在写哪个孩子,似乎更容易检测到写入调用的失败然后担心看起来充满危险的信号。 -
@mikew - 正如我的要点所示,一个简单的
print $PIPE "string"。此外,我还将检测 write 调用的返回 -
“可能有自己的管道对他们开放”中的“他们”是什么?