$ perl5.8 -w -e 'if (my $pid=open(my $P, "|-")) {
kill("SIGKILL",$pid); sleep(2); print $P "test1:$pid\n";}; '
Broken pipe
现在我正试图抓住那个破管子
$ perl5.8 -w -e '$SIG{PIPE} = sub {print "SIGPIPE\n";return 1};
if (my $pid=open(my $P, "|-")) {
kill("SIGKILL",$pid); sleep(2); print $P "test1:$pid\n"};
$
当我预料到的时候,什么都没有打印出来SIGPIPE
。好像它对待我的匿名子处理程序就好像它是一样的IGNORE
。
几乎所有子内容都不会产生任何效果(打印、模具、更改包变量值)
代码不会死;如果您最终将某些内容打印到 STDOUT,它将打印。
我错过了什么?
更新:@jm666 的回答让我想到了这个问题:管道的写入没有被刷新;因此,现在获得 SIGPIPE 还为时过早。添加自动刷新有助于:
$ perl5.8 -w -e 'use IO::Handle ;$SIG{PIPE} = sub {print "SIGPIPE\n"};
if (my $pid=open(my $P, "|-")) {
$P->autoflush(1);
kill(SIGTERM,$pid); sleep(2);;print $P "test1:$pid\n"}; '
SIGPIPE
$