为什么在Perl中waitpid会返回错误的退出代码?

时间:2009-12-30 15:14:04

标签: perl exit-code waitpid

我从waitpid得到错误的退出代码,我无法弄清楚原因。有人可以给我一些想法吗?

我在这做什么:

  1. 我使用open2
  2. 开始我的子进程
  3. 然后我等着waitpid
  4. 结束
  5. 使用$?
  6. 获取退出代码

    它总是以-1返回,而不是从子进程返回的内容。我用VS调试器检查我的程序返回的退出代码为0. VS说的是这样的:

    The program '[3256] Test.exe: Native' has exited with code 0 (0x0).
    

    我确保pids匹配。

    有什么想法吗?

4 个答案:

答案 0 :(得分:7)

我只是想通了。 waitpid有3个阶段:

 1. process is running:    waitpid returns 0;   $? is -1
 2. process is exiting:    waitpid returns pid; $? is actual exit code
 3. process doesn't exist: waitpid returns -1;  $? is -1

所以当做类似的事情(waitpid($ pid,WNOHANG)> = 0)时,必须在此之前的一个周期内检索退出代码。

答案 1 :(得分:3)

来自waitpid man page

  

请注意,在某些系统上,返回值“-1”可能意味着   正在自动收集子进程。   有关详细信息和其他示例,请参阅perlipc

答案 2 :(得分:0)

您应该关闭文件句柄,而不是使用waitpid。 (我假设你的问题中的“open2”是一个错字,你的意思是“打开”)

答案 3 :(得分:0)

适合我(Windows):

use IPC::Open3;
use POSIX ':sys_wait_h';
use Time::HiRes;

$|++;

my ($fin, $fh, $pid);
$pid = open3($fin, $fh, 0, 'ping', '8.8.8.8') or die('error');

my @lines = ();
while (1) {
    while (my $line = <$fh>) {
        push(@lines, $line);
        print('+');
    }
    print("\nret: `$?`\n"), last if waitpid($pid, WNOHANG) <= 0;
    Time::HiRes::usleep(100000);
    $fh->clearerr();
}
waitpid($pid, 0);
print("\nret: `$?`\n");

将输出:

++++++++++++
ret: `-1`

ret: `0`