SIGPIPE在这种情况下意味着什么?

时间:2009-11-06 14:13:53

标签: perl pipe

我有以下脚本结构:脚本A在B上打开PIPE,B在C上打开PIPE。因此数据流是A-> B-> C。 B抓住了SIGPIPE。尽管描述符IN和OUT已打开:

$SIG{'PIPE'} = sub {
$logger->info('caught PIPE signal.');
$logger->info("STDIN status: ".STDIN->opened());
$logger->info("STDOUT status: ".OUT->opened());
die;
};

STDIN status: 1
STDOUT status: 1

我已将IN添加到$ pool IO :: Select中,当IN位于$ pool-> can_read()中时,我使用sysread()读取它。一次,我用OUT写入OUT。此外,我在$ pool中有一个listen套接字,客户端可以连接到它。但我只是从客户那里读到的。我只写OUT。

2 个答案:

答案 0 :(得分:3)

根据Wikipedia article,这意味着C已经死亡:

  

在符合POSIX标准的平台上,SIGPIPE是在尝试写入管道而没有连接到另一端的进程时发送给进程的信号。

答案 1 :(得分:3)

描述符即使在该过程死亡后也将打开。例如,你可以阅读程序在死之前写的东西。

但是,如果您尝试写入死程序,它会向您发送一个SIGPIPE。

您可以通过等待其PID来检查子进程是否已死:

waitpid($childpid, &WNOHANG);

如果返回0,则表示孩子仍在运行。