## simplified code, so no error checking... foreach my $node (@devices) { my $pid = fork(); if( !$pid ) { ## child... exit 0; } ## parent wait(); } #### use POSIX; $SIG{CHLD} = sub { while( ( my $pid = waitpid(-1, POSIX::WNOHANG()) ) > 0 ){ ## cleanup code... ## you probably should save the forked ## pids and make sure that the result of ## waitpid is indeed your child } } foreach my $nod ( @devices ) { my $pid = fork(); if( !$pid ) { ## child... } } #### use POSIX; my $do_fork = 1; $SIG{CHLD} = sub { while( ( my $pid = waitpid(-1, POSIX::WNOHANG()) ) > 0 ){ ... } } foreach my $node ( @devices ) { if( $do_fork ) { my $pid = fork(); if( !$pid ) { do_exciting_things(); exit 0; } } else { do_exciting_things(); } }