Perl:在执行';开放式(A,“过程”和x27;制作';关闭(A)和"x27 ;;立即返回

Perl:在执行';开放式(A,“过程”和x27;制作';关闭(A)和"x27 ;;立即返回,perl,Perl,如果我做了“打开(A)”,如何让“关闭(A)”立即返回, 即使“proc”还没有完成对stdout的写入 “男人”告诉我: 过早关闭管道的读取端(即在流程之前 在另一端写入(已关闭)将导致 SIGPIPE正在交付给编写者。如果另一端无法处理 因此,在关闭管道之前,请务必读取所有数据 但是有解决办法吗?具体示例: $|=1; open(A,"curl -sN http://test.barrycarter.info/bc-slow-cgi.pl|"); while (<A>) {

如果我做了“打开(A)”,如何让“关闭(A)”立即返回, 即使“proc”还没有完成对stdout的写入

“男人”告诉我:

过早关闭管道的读取端(即在流程之前 在另一端写入(已关闭)将导致 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"; 
$|=1;
开放式(A,“卷曲-sN”http://test.barrycarter.info/bc-slow-cgi.pl|"); 
而{
打印“THUNK:$\un”;
如果(/5$/){last;}
} 
打印“循环退出\n”;
关闭(A);
打印“已关闭的\n”;
bc-slow-cgi.pl永远每秒只打印一次time():如上所示
代码打印“循环退出”,但从不打印“关闭”

open-|
创建的句柄上的
close
等待子进程结束。在我看来,在你调用
close
之后,孩子下次尝试写入时,应该会因为管道信号或错误而死亡,但如果你不想等待那么久,你可以杀死孩子

my $pid = open(...);

while (...) {
   ...
}

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

管道
有点不正统,但在这里似乎很合适。请随意发送
TERM
或任何东西。

您有什么版本的perl和curl?您的代码在perl 5.10.1和curl 7.21.3上按预期工作。快速搜索表明,在一个古老版本的curl中存在一些bug,导致它无法在sigpipperlv5.10.0和curl7.19.7上退出。我本来打算升级,但我更喜欢@ikegami的解决方案,因为它也适用于非curl程序