У меня есть скрипт, который порождает набор детей. Родитель должен дождаться завершения каждого из них.Воспроизведение дочерних процессов с Perl
Мой сценарий выполняет аналогично следующий сценарий PERL:
#! /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";
Подобного код я Приведенный выше, каждый ребенок может занять разное время, чтобы закончить.
Проблема заключается в том, что я пытаюсь пожинать детей, перебирая дочерние PID, в этом последнем блоке foreach
родитель ждет детей в том порядке, в котором они созданы.
Очевидно, что дети не заканчивают в порядке, в котором они рождаются, и поэтому я остаюсь с кучей процессов зомби для детей, которые заканчиваются рано.
В моем фактическом коде эти дети могут заканчивать дни друг перед другом, а число процессов зомби, плавающих вокруг, может вырасти в сотнях.
Есть ли лучший способ получить набор детей?
Основная причина быть в курсе: проверить, были ли они успешными. – ikegami
Эй, Бородин, проверьте [Синтаксис :: Feature :: Loop] (http://search.cpan.org/perldoc?Syntax::Feature::Loop) – ikegami
@ikegami: да, я иногда использую это. Я в основном переключаюсь между использованием while (1) ',' while() 'и' {... redo; } '. Ни один из них не является действительно удовлетворительным. – Borodin