use strict; use warnings; use POSIX ":sys_wait_h"; $SIG{CHLD} = \&REAPER; my @commands = qw/ls w id/; my %childs   = (); my %reaped   = (); foreach my $cmd (@commands) {   if (my $pid = fork) {      $childs{$pid} = '';   } else {      # 1 sekunde warten, da es sein kann, dass $childs{$pid}      # erst gesetzt wird, wenn der Child schon gestorben ist      sleep 1;      my $foo = qx{$cmd};      exit($?/256);   } } # solange schlafen, bis alle Childs eingesammelt wurden sleep while scalar keys %childs; print "child $_ terminated - status $reaped{$_}\n"   foreach sort keys %reaped; sub REAPER {   my $sig = shift;   my $pid;   while (($pid = waitpid(-1, WNOHANG)) > 0) {      delete $childs{$pid};      $reaped{$pid} = $sig.':'.$?;   }   $SIG{CHLD} = \&REAPER; }