2009-12-30 85 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` 
相關問題