2

waitpidから間違った終了コードを取得しましたが、その理由がわかりません。誰かが私にいくつかのアイデアを教えてもらえますか?

ここで私がすること:

  1. 私は私の子プロセスをopen2
  2. それから私はそれが終わるのを待ちますwaitpid
  3. を使用して終了コードを取得する$?

子プロセスから返すものは、常に-1で返されます。プログラムが終了コード0を返すことをVSデバッガーで確認します。VSは次のように言います。

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

pidが一致することを確認しました。

何か案は?

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のmanページから:

一部のシステムでは、戻り値「-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 に答える