Ich habe ein Skript, das eine Reihe von Kindern hervorbringt. Der Elternteil muss warten, bis alle Kinder fertig sind.Ernten untergeordneten Prozesse von Perl
Mein Skript führt die folgende Perl-Skript ähnlich:
#! /usr/bin/perl
use strict;
use warnings;
print "I am the only process.\n";
my @children_pids;
for my $count (1..10){
my $child_pid = fork();
if ($child_pid) { # If I have a child PID, then I must be the parent
push @children_pids, $child_pid;
}
else { # I am the child
my $wait_time = int(rand(30));
sleep $wait_time;
my $localtime = localtime;
print "Child: Some child exited at $localtime\n";
exit 0; # Exit the child
}
}
foreach my $child (@children_pids) {
print "Parent: Waiting on $child\n";
waitpid($child, 0);
my $localtime = localtime;
print "Parent: Child $child was reaped - $localtime.\n";
}
print "All done.\n";
ähnlich den Code, den ich oben zur Verfügung gestellt habe, jedes Kind eine andere Zeit zu beenden dauern.
Das Problem ist, wenn ich versuche, die Kinder durch Schleifen über die Kinder PIDs zu ernten, in diesem letzten foreach
Block, der Eltern wartet auf die Kinder in der Reihenfolge, dass sie erstellt werden.
Offensichtlich enden die Kinder nicht in der Reihenfolge, in der sie hervorgebracht werden, und so bleibt mir ein Haufen Zombie-Prozesse für Kinder, die früher zu Ende gehen.
In meinem tatsächlichen Code können diese Kinder Tage vor einander beenden und die Anzahl der herumschwebenden Zombie-Prozesse kann in den Hunderten wachsen.
Gibt es einen besseren Weg für mich, eine Reihe von Kindern zu ernten?
Hauptgrund, um informiert zu werden: Um zu sehen, ob sie erfolgreich waren. – ikegami
Hey Borodin, schau mal [Syntax :: Feature :: Loop] (http://search.cpan.org/perldoc?Syntax::Feature::Loop) – ikegami
@ikegami: ja das benutze ich manchmal. Ich flitze meistens zwischen 'while (1)', 'while()' und '{... redo; } '. Keine sind wirklich zufriedenstellend. – Borodin