Leser: 2
|< 1 2 >| | 13 Einträge, 2 Seiten |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
while (1) { pipe(READER,WRITER); READER->autoflush(1); WRITER->autoflush(1); my $pid = fork(); if($pid == 0){ # Child-Prozess close READER; print WRITER $$; print "Ich bin das Kind: ",$$,"\n"; my $output = system("/usr/bin/firefox file:///home/uname/log/testseite.html"); # print $output; exit(0); } else{ # Parent-Prozess print "Ich bin der Vater: ",$$,"\n"; wait(); close WRITER; my $i = 0; my @line = <READER>; while (1) { print "$i Ich bin der Vater: ",$$,"\n"; print "$i Und mein Kind ist: ",$line[0],"\n"; $i++; sleep(1); if ($i >= 5) { $i = 0; exit(0); # Child killen ! } } } print "besser dann doch abbrechen."; sleep(1); }
QuoteCode: (dl )my $output = system("/usr/bin/firefox file:///home/uname/log/testseite.html");
murphy+2008-09-16 00:55:26--@IceRage: Wenn man explizit wait aufruft, darf man sich nicht wundern, dass der Elternprozess auf seine Kinder wartet, bevor er weiter läuft.
murphy+2008-09-16 00:55:26--@moritz: Da vor dem system aufruf geforkt wird, ist es eigentlich keinesfalls nötig, mit einem & die Shell anzuweisen, den Prozess in den Hintegrund zu stellen.
murphy+2008-09-16 00:55:26--Wenn man in diesem einfachen Anwendungsfall selber forkt, könnte man aber statt system sicherer und resourcenschonender exec verwenden. Wenn man system nehmen will, könnte man sich das forken sparen und, wie moritz schreibt, den Befehl durch die Shell in den Hintergrund stellen lassen.
murphy+2008-09-16 00:55:26--Am besten ist es aber wahrscheinlich, etwas wie Proc::SafeExec zu verwenden.
my @line = <READER>;
IceRage+2008-09-16 09:00:41--murphy+2008-09-16 00:55:26--@IceRage: Wenn man explizit wait aufruft, darf man sich nicht wundern, dass der Elternprozess auf seine Kinder wartet, bevor er weiter läuft.
Also ich habe das wait() jetzt mal rausgenommen, der Eltern Prozess läuft aber leider dennoch nicht an. Erst wenn dich das aufgerufene Programm beendet habe.
[...]
my @line = <READER>;
Quote[...]
Mir ist noch etwas Anderes aufgefallen. Wenn ich mir mal den Rückgabewert vom READER anschaue, also die PID die bei:
Code (perl): (dl )my @line = <READER>;
ausgelesen wird, dann ist der immer exakt um den Betrag 2 zu gering, im Vergleich zu einer Ausgabe mit ps -aux | grep firefox.
[...]
IceRage+2008-09-16 00:13:48--[...]
Das Sktipt soll Folgendes tun:
- 1. Browser öffnen
- 2. In die while schleife (Parent Prozess) gehen
- 3. Nach 20 Schleifendurchläufen (Parent Prozess) den Browser, an Hand der übermittelten PID schließen.
- 4. Dann wieder das Selbe ... 1.
[...]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
use strict; use warnings; use POSIX; use constant TIMEOUT => 20; my $firefox; unless ($firefox = fork) { die "Failed to fork: $!" unless (defined $firefox); exec '/woimmer/ich/bin/firefox', 'http://www.example.com/'; die "Failed to spawn firefox: $!"; } else { # remember time the browser was started my $start = time; my $remaining = TIMEOUT; # only loop while the browser is still running and the timeout is not over while (waitpid($firefox, WNOHANG) < 0 and $remaining > 0) { sleep $remaining; $remaining = $start + TIMEOUT - time; } # send the browser a TERM signal kill TERM => $firefox; # clean up the zombie process die "Problems cleaning up the browser process: $!" if (waitpid($firefox, 0) < 0); }
1
2
3
4
5
6
7
8
9
10
11
12
unless(open(READ '-|')){
while(1){
print STDOUT "kind\n";
sleep(1);
}
}else{
sleep(5);
my @child=<READ>;
print "@child";
close(READ);
}
exit();
Gast+2008-09-16 12:17:28--1. "wait" wartet auf das beenden aller prozesse. Du brauchst "waitpid"
Gast+2008-09-16 12:17:28--[...]
3. warum nutzt du eine Pipe wenn du es auch so machen kannst:
Code: (dl )unless(open(READ '-|')){
[...]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#!/usr/bin/perl use POSIX; use warnings; use strict; my $file = "lines.txt"; open(LINES, "<$file"); my @ar_lines = <LINES>; print $ar_lines[0]."\n"; foreach my $link (@ar_lines) { print $link."\n"; my $pid = fork(); if($pid == 0){ # Child-Prozess print "Ich bin das Kind: ",$$,"\n"; # hier zu öffnender link, klappt alles nicht, auch nicht mit Backticks # my $ret_val = system("/usr/bin/firefox $link"); # my $ret_val = exec("/usr/bin/firefox $link"); # my $ret_val = `/usr/bin/firefox $link &`; # my $ret_val = system("/usr/bin/firefox $link &"); system("/usr/bin/firefox test.html"); sleep(35); exit(0); } else { # Parent-Prozess print "Ich bin der Vater: ",$$,"\n"; waitpid($pid, 0); print "Ich bin der Vater: ",$$,"\n"; print "Und mein Kind ist: ",$pid,"\n"; } sleep(20); }
|< 1 2 >| | 13 Einträge, 2 Seiten |