$ 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
$
答案 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};'