如果 open3 调用的程序的输出太大(超过 65536),waitpid 将永远运行。
use IPC::Open3;
use POSIX ":sys_wait_h";
my ($stdin, $stdout, $stderr);
my $program = "perl -e 'print \"a\" x 65537'";
my $args = [];
my $pid = open3 $stdin, $stdout, $stderr, $program, @$args;
waitpid($pid, 0);
WNOHANG解决了这个问题:
my $kid;
while (1) {
$kid = waitpid( $pid, WNOHANG );
last unless $kid > 0;
}
但是现在返回码是 $? 是-1。这是waitpid的返回码。它可以通过肮脏的黑客来解决:
my $open3_retcode;
my $kid;
while (1) {
$open3_retcode = $?;
$kid = waitpid( $pid, WNOHANG );
last unless $kid > 0;
}
做这些事情的正确方法是什么?
UPD。似乎肮脏的黑客并不总是有效。