为什么我的SIGPIPE不打印信息?

时间:2014-03-28 22:48:27

标签: perl pipe ipc sigpipe

$ 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而不是{。}}。

  • 几乎任何sub的内容都不会产生任何影响(打印,死亡,更改包变量值)

  • 代码不会死;如果你打印到STDOUT的东西到底会打印出来。

我错过了什么?


更新:@ jm666的回答引发了我的问题:管道的写入没有刷新;因此,获得SIGPIPE还为时过早。添加autoflush有助于:

$ 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
$

1 个答案:

答案 0 :(得分:3)

对管道的物理写入被延迟,因此您可以在结束时捕获它们。下一个打印消息。 (添加了close $P

perl -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";close $P};'

更多:http://perldoc.perl.org/perlipc.html