Schrift
[thread]8741[/thread]

Child-Überwachung bei Fork()

Leser: 3


<< >> 7 Einträge, 1 Seite
Gast Gast
 2007-02-08 15:58
#74180 #74180
Hallo zusammen,

ich möchte einen mit URLS gefüllten Array nach und nach an wget Prozesse übergeben.
Das heißt ich forke solange, bis ich eine eingestellte Anzahl an Kindprozessen ereeicht habe. Diese Überwachung funktioniert auch und er erzeugt genau soviele wget aufrufe wie eingestellt.
Also das gleichzeitige herunterladen von 5 verschiedenen Urls aus dem Array funktioniert. Nun möchte ich aber sobald ein Kindprozess beendet ist, den nächsten starten (wenn der array nocht nicht ganz durchgearbeitet ist).

Das ganze sieht schematisch im Moment so aus:
Code: (dl )
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
##Variablen für parallele Downloads
my @child_pids = ();
my $max_childs = 2;

for my $i (0..$#ini_data){

$c_childs = @child_pids;
if($c_childs < max_childs)
{
#Erzeugen von Child-Prozessen

$pid = fork();

#Child-Prozess Ablauf
if($pid == 0)

{

WGET BEFEHL
}

else

{

push(@child_pids, $pid);

}
}
}

foreach(@child_pids)
{
waitpid($_, 0);
}



Hat hier jemand vl einen Vorschlag wie ich das lösen könnte?
Alle meine Versuche mit while schleifen waren bisher umsonst :(

Wäre euch echt dankbar!

Gruß,
Simon
pq
 2007-02-08 16:17
#74181 #74181
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
perldoc POSIX (konstante WNOHANG)
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
betterworld
 2007-02-08 18:39
#74182 #74182
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wenn Du bei waitpid als erstes Argument -1 angibst, wird einfach solange gewartet, bis irgend ein Kind stirbt. Die PID sollte dann im Nicht-Fehlerfall im Rueckgabewert stehen.

Ich hoffe, Du rufst wget ueber exec() auf und hast dahinter ein die() stehen.\n\n

<!--EDIT|betterworld|1170952861-->
bloonix
 2007-02-09 01:54
#74183 #74183
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo SiSo1984,

die Child-Prozesse sollten mit dem Parent Prozess kommunizieren.
Das kannst du auf verschiedene Weise realisieren. Vielleicht über
Dateien, besser aber über Sockets. Dann kannst du mit select()
alle paar Sekunden nachschauen, ob sich ein Child beendet hat und
musst nicht endlos warten.

Hier ein kleines Beispiel, wie sich Parent und Child unterhalten können:

Code: (dl )
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 Socket;
use IO::Handle;

my ($kidfh, $dadfh);
socketpair($kidfh, $dadfh, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
or die "socketpair: $!";

$kidfh->autoflush(1);
$dadfh->autoflush(1);

if (my $pid = fork) {
close $dadfh;
print $kidfh "Parent Pid $$ sendet dies\n";
chomp(my $line = <$kidfh>);
print "Parent Pid $$ liest gerade dies: $line\n";
close $kidfh;
waitpid($pid,0);
} else {
close $kidfh;
chomp(my $line = <$dadfh>);
print "Child Pid $$ liest gerade dies: $line\n";
print $dadfh "Child Pid $$ sendet dies\n";
close $dadfh;
exit;
}


Gruss,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2007-02-09 12:42
#74184 #74184
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wenn man nonblocking-waitpid verwendet, wie ich gesagt habe, muss man
gar keine kommunikation aufbauen.
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
betterworld
 2007-02-12 00:58
#74185 #74185
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=pq,09.02.2007, 11:42]wenn man nonblocking-waitpid verwendet, wie ich gesagt habe, muss man
gar keine kommunikation aufbauen.[/quote]
In dem Fall wird man aber nicht benachrichtigt, wenn ein Kind stirbt.  Da muss man dann entweder zusaetzlich SIGCHLD oder busy waiting (boese) oder sleep (unpraezise, auch wenn es Time::HiRes gibt) einsetzen.

Aber wie ich schon schrieb: Man kann einfach auf -1 warten.\n\n

<!--EDIT|betterworld|1171235893-->
pq
 2007-02-12 11:27
#74186 #74186
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
betterworld: es kommt halt drauf an, was der OP will. meine antwort
war für opi gedacht. ich wollte deine lösung nicht übergehen.
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
<< >> 7 Einträge, 1 Seite



View all threads created 2007-02-08 15:58.