I didn't write this, but it does seem to answer your needs. Another option is to actually use an eventloop system like
Glib or
AnyEvent.
#!/usr/bin/perl
use warnings;
use strict;
# by some monk here at perlmonks
# wait basically waits until one of the children exits.
# It is used to avoid having Zombie processes: if you don't
# wait() for them, and you go a long time in your parent
# process before exiting, you'll see these processes in
# the process list even if they already exited, marked as
# "zombie" (this means that resources in the kernel associated
# to the process aren't freed). So, wait is the way by which
# the parent process acknowledges the kernel of the son's death.
# It's interesting that this mechanism actually tries to force
# the programmer not to ignore return values from child processes,
# much like the good practice of never throwing away return values
# from functions.
# Moreover, wait returns as soon as the first child exits; in
# the OP's post, (s)he created 8 of them, and had to wait until
# all of them have exited. According to perldoc -f wait, a call
# to the wait function returns -1 if, and only if, there are no
# more children alive(1) - thus the cycle.
# If you happened to set $SIG{'CHLD'} to 'IGNORE',
# this zombie-ridding happens automatically, and you're likely to
# have wait always return -1 - but I guess it's not the case with
# this thread :) Moreover, in this case I would discourage the
# OP to do that, because (s)he's using wait as a synchronisation
# mechanism to understand when all the children exited. BTW, this
# is documented in perldoc perlipc, but I suggest taking a look in
# perldoc perlport as well.
for ( my $i = 0 ; $i < 11 ; $i++ ) {
defined( my $pid = fork() ) or print STDERR "Unable to fork!";
if ($pid) {
print "Child $i is $pid\n";
}
else {
print "Hi! I'm just a kid.. I'm going to sleep now..\n";
sleep rand(10);
print "*Yawn* I'm awake! Huh? It's me! Kid $$! Bye bye!
$$ Time to die!\n";
exit 0;
}
}
#this is correct
1 while wait > 0;
# wait by itself is different
# wait;
print "Screw this, I'm done waiting for those kids\n";