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