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

bar*_*ter 2 perl

如果我'打开(A,"proc |")',即使'proc'没有写完到stdout,我如何让'close(A)'立即返回?

"man perlfunc"告诉我:

过早地关闭管道的读取端(即在另一端写入它的过程关闭它之前)将导致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"; 
Run Code Online (Sandbox Code Playgroud)

bc-slow-cgi.pl只是每秒打印一次time():上面的代码打印"LOOP EXIT",但从不"A CLOSED".

ike*_*ami 5

close在open -|等待孩子结束创建的句柄上.在我看来,孩子在你打电话下次尝试写信时应该死于PIPE信号或错误close,但是如果你不想等那么久,你可能会杀死孩子.

my $pid = open(...);

while (...) {
   ...
}

kill PIPE => $pid;
close(...);
Run Code Online (Sandbox Code Playgroud)

PIPE有点不正统,但这似乎合适.随意发送TERM或其他任何东西.