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;
}
そのようなことを行う適切な方法は何ですか?
アップデート。汚いハックが常に機能するとは限らないようです。