0

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;
}

そのようなことを行う適切な方法は何ですか?

アップデート。汚いハックが常に機能するとは限らないようです。

4

1 に答える 1