如果我'打开(A,“proc |”)',我如何让'close(A)'立即返回, 即使'proc'还没有完成写入stdout?
过早关闭管道的读取端(即在处理之前) 在另一端写到它已关闭它将导致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”。
答案 0 :(得分:5)
close
创建的句柄上的 open -|
等待孩子结束。在我看来,孩子在你打电话close
后下次尝试写信时应该死于PIPE信号或错误,但是如果你不想等那么久,你就可以杀死孩子。
my $pid = open(...);
while (...) {
...
}
kill PIPE => $pid;
close(...);
PIPE
有点不正统,但这似乎合适。随意发送TERM
或其他任何内容。