in reply to what is this doing? - while (wait() != -1)

wait/waitpid returns -1 when there are no children or the children are automatically being reaped ( according to perldoc -f wait ). So the loop is waiting for all of the children to exit

I personally don't like this child count decrementing business... I'd rather explicitly check if the pid that I just got is the pid that I'm waiting for, i.e., my child. That may just be me...

## XXX - I use hashes in this type of situation ## because I usually associate more meta data to a pid ## which must be used by the parent when the child ## exits... and delete $hash{ $foo } is cleaner ## than splice() to me :) use POSIX; my %pids; for( 1 .. $numchild ) { my $pid = fork(); ## check if $pid id defined, etc. if( $pid ) { ## parent $pids{ $pid } = 1; } else { do_interesting_stuff(); exit; } } while( ( my $pid = waitpid(-1, POSIX::WNOHANG() ) ) > 0 ){ if( exists $pids{ $pid } ) { delete $pids{ $pid }; } else { print STDERR "Unknown child $pid\n"; } }