2009-12-30 58 views
2

我从waitpid得到错误的退出代码,我找不出原因。有人能给我一些想法吗?为什么会在Perl中的waitpid返回错误的退出代码?

这里我做什么:

  1. 我开始了我的子进程open2
  2. 然后我等待它与waitpid
  3. 完成获得使用$?

它总是退出代码以-1返回不管我从子进程返回的是什么。我请与VS调试器,我的程序返回的退出代码0 VS说是这样的:

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

我确信,PID相匹配。

任何想法?

+2

难道您发布Perl代码,使用 “休眠”,而不是你的计划吗? – Arkadiy 2009-12-30 15:17:14

回答

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

或者您可以只调用waitpid($ pid,0),它将等待直到程序退出。 – 2009-12-30 16:03:57

+0

啊 - 是的,waitpid只报告一次结果。 – 2009-12-30 16:40:06

+0

Paul:是的,这是行得通的,但我无法阻止,因为我需要在进程运行时读取日志文件。 – 2009-12-31 09:30:13

3

waitpid man page

注意,在某些系统中,一个返回值“-1”可能意味着 该子进程被自动收割。 查看perlipc了解详情和其他示例。

0

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

+4

open2(请参阅IPC :: Open2)是一种调用,允许您将输入发送到同一程序并从同一程序接收输出 – mob 2009-12-30 15:29:14

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` 
相关问题