PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: warten auf Kind Prozess und während dessen eine Ausgabe..



Basti_litho
29-03-2004, 09:37
Hallo,

folgendes Problem: ich will einen Prozess (bzw. Programm) starten und während dessen eine Ausgabe produzieren - aber nur solange bis der Kind Prozess sich beendet hat.

Mit fork und wait? (Das hab ich schon versucht - bin aber nicht wirklich weiter gekommen).

Zweite Frage: wie kann ich das realisieren, dass er z.b. 20 Sekunden wartet und während dessen jede Sekunde eine Ausgabe macht?

Vielen Dank!
Gruss,
Basti

Basti_litho
29-03-2004, 11:22
Ok,

für meine erste Frage hat mir google schon mal geholfen :D

muss ungefähr so aussehen:



#!/usr/bin/perl -w


$SIG{'CHLD'} = 'reaper';

$retval = fork();
if ($retval == -1) {
# fork() failed
die "fork() failed: $!\n";
} elsif ($retval == 0) {
# child process
print "Wir sind Kind-Prozess\n";
system("sleep 6");
exit 0;
} else {
# parent process
print "Wir sind Eltern-Prozess\n";
while(kill 0 => $retval) {print ".\n"; sleep 1; }
exit 0;
}


sub reaper {
waitpid(-1,0); # ein zombie abholen
}

das wichtigste ist der Signalhandler und die "reaper" Funktion - die den Rückgabwert des Child prozesses abholt - sonst bleibt er als Eintrag in der Prozess Tabelle und eine abfrage, ob er noch da ist, geht unendlich.

Gruss,
Basti

Basti_litho
29-03-2004, 11:58
ok,

dann möchte ich nochmal versuchen meine (zweite) Frage besser zu formulieren:

Eigentlich möchte ich, dass ich ihm sage:

"...Warte zwei Sekunden und solange du wartest, führe bitte dieses und jenes aus...."

Ich glaub das trifft es am besten.

Gruss,
Basti

Thomas Engelke
30-03-2004, 08:22
Mal eine Frage zu dem Codesegment:


while(kill 0 => $retval) {print ".\n"; sleep 1; }

Ist das sauber? Sagt Larry nicht, daß "=>" "roughly equivalent" zu einem Komma ist? Ganz unabhängig davon, daß der Operator ja für einen anderen Zweck eingeführt wurde ...

AD!