Perl:当'打开(A,“proc |”)'make'关闭(A)'立即返回时

时间:2011-09-11 01:35:10

标签: perl

如果我'打开(A,“proc |”)',我如何让'close(A)'立即返回, 即使'proc'还没有完成写入stdout?

perlfunc“告诉我:

  

过早关闭管道的读取端(即在处理之前)   在另一端写到它已关闭它将导致a   SIGPIPE交付给作者。如果另一端无法处理   请务必在关闭管道之前读取所有数据。

但是有解决方法吗?具体例子:

$|=1; 
open(A,"curl -sN http://test.barrycarter.info/bc-slow-cgi.pl|"); 

while (<A>) { 
  print "THUNK: $_\n"; 
  if (/5$/) {last;} 
} 

print "LOOP EXIT\n"; 
close(A); 
print "A CLOSED\n"; 

bc-slow-cgi.pl只会永远每秒打印一次time():上面的内容 代码打印“LOOP EXIT”,但从不“A CLOSED”。

1 个答案:

答案 0 :(得分:5)

close创建的句柄上的

open -|等待孩子结束。在我看来,孩子在你打电话close后下次尝试写信时应该死于PIPE信号或错误,但是如果你不想等那么久,你就可以杀死孩子。

my $pid = open(...);

while (...) {
   ...
}

kill PIPE => $pid;
close(...);

PIPE有点不正统,但这似乎合适。随意发送TERM或其他任何内容。