我正在尝试处理如下工作的服务器:
- 它有一个父进程
- 它创建一个“助手”子进程来处理一些特殊任务
- 它用管道打开子进程;并使用管道向孩子发出命令。
- 它还衍生出许多其他子进程(服务器的主要目标是执行各种命令)。
我希望能够检测到向子进程的管道写入失败的时间;并发出特别通知。
$SIG{PIPE}
通常,我会通过在父进程中创建自定义处理程序来实现这一点。
但是,我关心的是父进程启动以执行命令的某些进程可能有自己的管道对它们开放。如果写入 THOSE 管道失败,我想简单地忽略 SIGPIPE。
Q1。有没有办法让我从 SIGPIPE 处理程序中分辨出哪个打开的管道发出了信号?(我知道每个孩子的 PID,所以 PID 会很好......或者如果有办法通过文件描述符#s 来做到这一点?)。
Q2。我可以使用local $SIG{PIPE}
某种方式解决问题吗?我的假设是我需要:
local $SIG{PIPE}
在写入该管道之前设置 helper-process-specific- 做
print $HELPER_PIPE
(这只发生在一个子程序中) - 将 $SIG{PIPE} 重置为
DEFAULT
或IGNORE
- 确保这 3 个操作在它们自己的块范围内。