我从 waitpid 得到错误的退出代码,我不知道为什么。有人可以给我一些想法吗?
我在这里做什么:
- 我开始我的孩子进程
open2
- 然后我等待它完成
waitpid
- 使用获取退出代码
$?
无论我从子进程返回什么,它总是返回 -1。我用 VS 调试器检查我的程序返回的退出代码为 0。VS 说这样的话:
The program '[3256] Test.exe: Native' has exited with code 0 (0x0).
我确保pids匹配。
有任何想法吗?
我刚刚想通了。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) 之类的操作时,必须在此之前的循环中检索一次退出代码。
请注意,在某些系统上,“-1”的返回值可能意味着子进程正在被自动收割。有关详细信息和其他示例,请参见perlipc。
而不是使用waitpid,您应该只关闭文件句柄。(我假设你问题中的“open2”是一个错字,你的意思是“open”)
为我工作(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`