Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6181[/thread]

so lange eine Funktion ausführen bis fork beendet.

Leser: 1


<< >> 10 Einträge, 1 Seite
quetzalcoatl
 2004-04-03 17:36
#81440 #81440
User since
2004-04-01
51 Artikel
BenutzerIn
[default_avatar]
Hallo,

folgendes Problem:

ich möchte ein externes Programm aufrufen (mit fork o.ä.) und während dieses Programm läuft hätte ich gerne einen fortschrittsbalken, so in der Art wie "Tk::ProgressBar".

Nur leider will mir nicht gelingen eine andere funktion so lange laufen zu lassen bis sich mein child prozess beendet hat.

Das Problem ist auch - das ich nicht genau weiß wie lange das Programm braucht. Wichtig ist nur das sich nebenbei noch was tut - damit man nicht auf die Idee kommt, das Programm wäre hängen geblieben.

Hab schon mit waitpid, fork und while rumprobiert - irgendwie will das aber nicht so wie ich es will :D

Hat jemand von euch noch ne gute idee?

Danke,
Gruss,
quetzalcoatl
pq
 2004-04-03 19:41
#81441 #81441
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
du musst per wait() auf den child-prozess warten - allerdings ein nichtblockierendes wait(), das du
dann in einer schleife aufrufst, bis es erfolgreich ist.

edit: siehe das beispiel in perlipc.pod, in etwa:
use POSIX ":sys_wait_h";
# ...
while(!waitpid ($childpid,WNOHANG)) {
# sleep
}
\n\n

<!--EDIT|pq|1081007348-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
quetzalcoatl
 2004-04-05 12:18
#81442 #81442
User since
2004-04-01
51 Artikel
BenutzerIn
[default_avatar]
Hallo,

erstmal vielen Dank für die schnelle Hilfe (auch wenn ich jetzt erst dazu komme zu Antworten).

Klappt hervorragend! :)

Vielen Dank!

Gruss,
quetzal
quetzalcoatl
 2004-04-05 14:51
#81443 #81443
User since
2004-04-01
51 Artikel
BenutzerIn
[default_avatar]
jetzt hab ich leider ein anderes - daraus resultirendes Problem.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
$retval = fork();
if ($retval == -1) {
   die "fork() failed: $!\n";
} elsif ($retval == 0) {
   exec("$find / -type f > tmp.txt 2>&1") || die "Error\n";
} else {
    while(!waitpid ($retval, WNOHANG)) {
    if ( $percent_done == 150) { $percent_done=0 } else { $percent_done++; $toplw->update(); sleep 1; }
    }
}

bei mir gings nur mit "exec", das Problem ist aber nur - wenn der Benutzer nun auf abbrechen klickt - dann tötet er zwar sich, aber nicht den "exec" Child - sprich: meine find suche läuft noch weiter.

Hab schon versucht die pid während des forks in eine Datei zu schreiben - diese beim Abbrechen Button auszulesen und die darin enthaltene PID zu töten. Funktioniert auch - aber zwischendurch stand da mal "0" drinnen - und den möchte ich nicht killen ;)

Daher: gibt es eine einfach möglichkeit, um so einen "exec" Prozess wieder zu töten?

Gruss,
quetzal
Crian
 2004-04-05 14:54
#81444 #81444
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
0 kannst Du als normaler User eigentlich nicht killen. Trotzdem unschön.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2004-04-05 15:52
#81445 #81445
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
naja, die pid hast du ja im parent-programm - mach ein kill SIGNAL, $childpid if $childpid;
SIGNAL musst du nachgucken, mit kill -l z.b.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Relais
 2004-04-05 16:47
#81446 #81446
User since
2003-08-06
2257 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Crian,05.04.2004, 12:54]0 kannst Du als normaler User eigentlich nicht killen. Trotzdem unschön.[/quote]
0 kann niemand killen, die Unix-Prozesse fangen bei der 1 (init) an ;)
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
Crian
 2004-04-05 17:20
#81447 #81447
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Hmmm ... stimmt. Aber gab es nicht irgendwas was davor kam, die 0 bekam und dann gleich wieder verschwand? Irgendsowas schwebt mir im Honterkopf rum, aber so oder so kann man es nicht killen. Entweder es ist nicht oder nicht mehr da, was eigentlich keinen großen Unterschied macht.

Wird Null vielleicht vergeben, wenn die pids bei Maxint vorbeigekommen sind? Ist bei langen Laufzeiten schon möglich...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
quetzalcoatl
 2004-04-05 19:26
#81448 #81448
User since
2004-04-01
51 Artikel
BenutzerIn
[default_avatar]
so, weiß zwar nicht warum er die null bekommt, aber Relais hat natürlich recht - es fängt ja erst bei eins an :D

ich hab's nun dabei belassen - und so gehts. :)

Danke!

Gruss,
quetzal
ptk
 2004-04-07 20:10
#81449 #81449
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Uebrigens gibt perls fork() undef zurueck, wenn fork() fehlschlaegt, nicht -1.
<< >> 10 Einträge, 1 Seite



View all threads created 2004-04-03 17:36.