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

1 回答 1

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

于 2014-03-28T23:26:28.653 回答