PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PERL: exit(), wieso existier PID weiter



TB09
06-04-2010, 09:36
Hallo,

ich habe folgendes Skript geschrieben, um zu checken, ob ein Prozess noch aktiv ist.
Trotz des exit()-Befehl, existiert der Prozess anscheinend weiter.
Wiseo. Kann mir jemand sagen, was ich falsch mache bzw. wie ich das Ende des Child Prozesses überwachen kann, ohne dass das Hauptprogramm warten muss?

Beste Dank!

Hier
das Skript und die dazugehörige Ausgabe:

Skript:



print "Start..\n";
$pid=fork();
if ($pid) {
print "Elternprozess\n";
}
else{
print "ChildProzess..\n";
sleep(15);
print "kurz vor Child-Ende\n";
exit();
}

if ($pid) {
print "Im if-Bereich\n";
do{
$check=kill 0, $pid;
print "Check: $check\n";
$count++;
sleep(1);
}until((!($check)) or ($count > 25));
}




AUSGABE:

Start..
Elternprozess
Im if-Bereich
Check: 1
ChildProzess..
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
kurz vor Child-Ende
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1
Check: 1

jeebee
06-04-2010, 10:16
schau dir mal waitpid an (perldoc -f waitpid). Damit funktionierts bei mir wie gewünscht (Linux).


#!/usr/bin/env perl

use POSIX ":sys_wait_h";

print "Start..\n";
$pid=fork();
if ($pid) {
print "Elternprozess\n";
}
else{
print "ChildProzess..\n";
sleep(15);
print "kurz vor Child-Ende\n";
exit();
}

if ($pid) {
print "Im if-Bereich\n";
do{
$check = waitpid($pid, WNOHANG);
print "Check: $check\n";
$count++;
sleep(1);
}until((($check)) or ($count > 25));
}