use POSIX; ... code here ... $child_pid = waitpid(-1, WNOHANG); #### use POSIX; if ($pid = fork) { # parent do { local $| = 1; print "\b-"; sleep 1; print "\b\\"; sleep 1; print "\b|"; sleep 1; print "\b/"; sleep 1; $child_pid = waitpid(-1,WNOHANG); } until $child_pid == -1; } else { # child #exec("cmd"); sleep 15; exit(0); } #### use POSIX; $keep_going = 1; #set the SIGCHLD signal handler $SIG{CHLD} = \&REAPER; if ($pid = fork) { # parent while($keep_going) { local $| = 1; print "\b-"; sleep 1; print "\b\\"; sleep 1; print "\b|"; sleep 1; print "\b/"; sleep 1; } } else { # child sleep 15; exit(0); } #SIGCHLD signal handler sub REAPER { #test if all childred are dead unless(waitpid(-1, WNOHANG) == -1 ) { $keep_going = 0; } #reset the signal handler for more than #one child death. $SIG{CHLD} = \&REAPER }