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

做这些事情的正确方法是什么?

UPD。似乎肮脏的黑客并不总是有效。

4

1 回答 1

4

如果您不读取程序的输出(例如 $stdout 和 $stderr),它会在一段时间后挂起,因为缓冲区已满。这将导致它永远不会返回。所以正确的方法是读取程序发送给你的数据,直到你没有更多的数据(eof)。然后你可以调用waitpid,它就会成功。

于 2014-07-14T10:45:28.430 回答