2

我从 waitpid 得到错误的退出代码,我不知道为什么。有人可以给我一些想法吗?

我在这里做什么:

  1. 我开始我的孩子进程open2
  2. 然后我等待它完成waitpid
  3. 使用获取退出代码$?

无论我从子进程返回什么,它总是返回 -1。我用 VS 调试器检查我的程序返回的退出代码为 0。VS 说这样的话:

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

我确保pids匹配。

有任何想法吗?

4

4 回答 4

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

因此,当执行诸如 while(waitpid($pid, WNOHANG) >= 0) 之类的操作时,必须在此之前的循环中检索一次退出代码。

于 2009-12-30T15:32:00.043 回答
3

waitpid 手册页

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

于 2009-12-30T15:24:07.300 回答
0

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

于 2009-12-30T15:26:23.147 回答
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`
于 2015-01-23T15:03:05.743 回答