$ perl5.8 -w -e 'if (my $pid=open(my $P, "|-")) {
kill("SIGKILL",$pid); sleep(2); print $P "test1:$pid\n";}; '
Broken pipe
现在,我想抓住那水管坏了为什么我的SIGPIPE不能打印消息?
$ 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:@ 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
$
FWIW,没有问题用Perl 5.16捕捉管。我的意思是子被正确执行。顺便说一句,操作系统是什么? –
@ i-blis - 我在Solaris上使用Perl 5.8并在Linux上使用5.8和5.12。除非在我的环境中有特殊设置,否则应该排除操作系统特定的问题;不确定5.12和5.16之间是否存在版本特定的管道错误 – DVK
您在哪个平台上运行? – Borodin