$ 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。
我遗漏了什么?
UPDATE:@ me 666的回答让我想到了这个问题:管道的书写没有被刷新;因此,获得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
$发布于 2014-03-28 23:26:28
对管道的物理写入会延迟,因此您可以在关闭时捕获它们。下一个打印消息。(添加了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
https://stackoverflow.com/questions/22724473
复制相似问题