Ho uno script che genera un gruppo di figli. Il genitore deve aspettare che tutti i bambini finiscano.Elaborazione di processi figlio da Perl
mio script esegue simile al seguente script 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";
simile al codice ho fornito in precedenza, ogni bambino può richiedere un tempo differente per terminare.
Il problema si verifica quando provo a raccogliere i bambini eseguendo il looping dei PID figli, in quest'ultimo blocco foreach
, il genitore attende i bambini nell'ordine in cui sono stati creati.
Ovviamente i bambini non finire nell'ordine cui sono generati e così mi sono lasciato con un gruppo di processi zombie per i bambini che capita di finire presto.
Nel mio codice attuale, questi bambini possono finire giorni prima l'uno dell'altro e il numero di processi di zombi che fluttuano intorno può crescere a centinaia.
C'è un modo migliore per raccogliere un gruppo di bambini?
Motivo principale per essere informati: per vedere se hanno avuto successo. – ikegami
Hey Borodin, controlla [Syntax :: Feature :: Loop] (http://search.cpan.org/perldoc?Syntax::Feature::Loop) – ikegami
@ikegami: sì, a volte lo uso. Per lo più faccio il flit tra l'uso di 'while (1)', 'while()' e '{... redo; } '. Nessuno è veramente soddisfacente. – Borodin