Question

Je reçois un mauvais code de sortie de waitpid et je ne peux pas comprendre pourquoi. Quelqu'un pourrait-il me donner quelques idées?

Voici ce que je fais:

  1. Je commence mon processus d'enfant avec open2
  2. je l'attends pour terminer avec waitpid
  3. obtenir le code de sortie en utilisant $?

Il retourne toujours avec -1 pas de mater ce que je reviens du processus enfant. Je vérifie avec VS débogueur que mon programme retourne un code de sortie de 0. VS dit quelque chose comme ceci:

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

Je me suis assuré que match de pid.

Toutes les idées?

Était-ce utile?

La solution

Je viens tout compris. waitpid a 3 étapes:

 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

lorsque vous faites quelque chose comme while (waitpid (pid $, WNOHANG)> = 0) le code de sortie doit être récupéré une fois le cycle avant.

Autres conseils

De la waitpid page man :

  

Notez que sur certains systèmes, une valeur de retour de « -1 » pourrait signifier   que les processus enfants sont automatiquement collectés.   Voir perlipc pour plus de détails, et pour d'autres exemples.

Plutôt que d'utiliser waitpid, vous devriez juste fermer le descripteur de fichier. (Je suppose que le « open2 » dans votre question est une faute de frappe, et que vous vouliez dire « ouvert »)

fonctionne pour moi (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");

Affichera:

++++++++++++
ret: `-1`

ret: `0`
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top