Perl 是否可能检测到哪个管道抛出了SIGPIPE?

Perl 是否可能检测到哪个管道抛出了SIGPIPE?,perl,pipe,ipc,sigpipe,Perl,Pipe,Ipc,Sigpipe,我正在尝试处理一个如下工作的服务器: 它有一个父进程 它创建一个助手子进程来处理一些特殊任务 它使用管道打开子进程;并使用管道向子对象发出命令。 它还衍生出许多其他子进程。服务器的主要目标是执行各种命令。 我希望能够检测到何时向管道写入子进程失败;并发出特别通知 通常,我会通过在父进程中创建自定义$SIG{PIPE}处理程序来实现这一点 然而,我所关心的是,父进程为执行命令而启动的某些进程可能有自己的管道向它们开放;如果对这些管道的写入失败,我只想忽略SIGPIPE 问题1。有没有一种方法可以让

我正在尝试处理一个如下工作的服务器:

它有一个父进程 它创建一个助手子进程来处理一些特殊任务 它使用管道打开子进程;并使用管道向子对象发出命令。 它还衍生出许多其他子进程。服务器的主要目标是执行各种命令。 我希望能够检测到何时向管道写入子进程失败;并发出特别通知

通常,我会通过在父进程中创建自定义$SIG{PIPE}处理程序来实现这一点

然而,我所关心的是,父进程为执行命令而启动的某些进程可能有自己的管道向它们开放;如果对这些管道的写入失败,我只想忽略SIGPIPE

问题1。有没有一种方法可以让我从SIGPIPE处理程序中分辨出哪个打开的管道抛出了信号?我知道每个孩子的PID,所以PID很好。。。或者如果有一种方法可以通过文件描述符s?来实现

问题2。我可以用本地$SIG{PIPE}解决这个问题吗?我的假设是,我需要:

在写入帮助程序进程特定的本地$SIG{PIPE}之前,将其设置为正确 打印$HELPER\u管道这只在一个子例程中发生 将$SIG{PIPE}重置为默认值或忽略 确保这3个动作在各自的块范围内。
write系统调用在触发SIGPIPE的相同情况下返回错误EPIPE,假设SIGPIPE无法成功终止进程。因此,最好的方法是设置$SIG{PIPE}='IGNORE'以避免因信号而死亡,使用$fh->autoflush以避免PerlIO缓冲,确保立即通知您任何I/O错误,并在调用print时检查其返回值。如果打印返回false和$!{EPIPE}已设置,则您已尝试写入一个封闭管道。如果打印返回false和$!{EPIPE}未设置,您还有一些其他问题需要处理。

在触发SIGPIPE的相同情况下,write系统调用返回错误EPIPE,假设SIGPIPE未能成功终止进程。因此,最好的方法是设置$SIG{PIPE}='IGNORE'以避免因信号而死亡,使用$fh->autoflush以避免PerlIO缓冲,确保立即通知您任何I/O错误,并在调用print时检查其返回值。如果打印返回false和$!{EPIPE}已设置,则您已尝试写入一个封闭管道。如果打印返回false和$!{eppe}未设置,您还有一些其他问题要处理。

您不知道。但是,您可能会发现您的操作系统支持SIG_INFO信息,如果您能以某种方式将其升级到Perl,那么siginfo结构包含一个字段,该字段给出了SIGPIPE上的FD编号。

可移植,您无法分辨。但是,您可能会发现您的操作系统支持SIG_INFO信息,如果您能以某种方式将其升级到Perl,则siginfo结构包含一个字段,该字段给出SIGPIPE上的FD编号。

不确定您正在使用什么来编写命令,但如果写入失败,则perldoc-f syswrite,如果它不返回“undef”,并且您也知道自己在写哪个孩子,似乎更容易检测到写调用中的失败,然后担心看起来充满危险的信号。@mikew-正如我的要点所示,一个简单的print$管道字符串。此外,我还将检测写入调用的返回。它们在什么位置可能有自己的管道向它们打开?不确定您正在使用什么来编写命令,但是如果写入失败perldoc-f syswrite,它是否应该不返回“unde”,并且既然您也知道您正在编写哪个孩子,似乎更容易在写调用中检测失败,然后担心看起来充满危险的信号。@mikew-正如我的要点所示,一个简单的print$PIPE字符串。此外,我还将检测写调用的返回。它们在什么地方可能有自己的管道向它们开放?@ikegamiit绕过缓冲IO-f syswrite.@ikegami它绕过缓冲IO-为了保存其他文件,我从C中发现这个si_fd字段不包含任何有用的文件。它是为SIGPOLL设计的。si_fd实际上是联合子结构sigpoll中的一个字段。为了保存其他字段,从C中我发现这个si_fd字段不包含任何有用的SIGPIPE。它是为SIGPOLL设计的。si_fd实际上是联合子结构sigpoll中的一个字段。