我从waitpid得到错误的退出代码,我无法弄清楚原因。有人可以给我一些想法吗?
我在这做什么:
open2
waitpid
$?
它总是以-1返回,而不是从子进程返回的内容。我用VS调试器检查我的程序返回的退出代码为0. VS说的是这样的:
The program '[3256] Test.exe: Native' has exited with code 0 (0x0).
我确保pids匹配。
有什么想法吗?
答案 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)
请注意,在某些系统上,返回值“-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`