首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的SIGPIPE不打印消息?

为什么我的SIGPIPE不打印消息?
EN

Stack Overflow用户
提问于 2014-03-28 22:48:26
回答 1查看 243关注 0票数 3
代码语言:javascript
复制
$ perl5.8 -w -e 'if (my $pid=open(my $P, "|-")) {
      kill("SIGKILL",$pid); sleep(2); print $P "test1:$pid\n";}; '
Broken pipe

现在我正试着抓住那个坏掉的管子

代码语言:javascript
复制
$ 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,它最终会打印出来。

我遗漏了什么?

UPDATE:@ me 666的回答让我想到了这个问题:管道的书写没有被刷新;因此,获得SIGPIPE还为时尚早。添加自动刷新有助于:

代码语言:javascript
复制
$ 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
$
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-28 23:26:28

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

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22724473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档