sub Fork { my $pid; my $retry = 0; # The following loop structure is responsible for performing a fork safely - # If the core fork function returns a valid process identification value, # this is returned and this subroutine is exited. If however, an error # occurs, an attempt is made to retry the fork, if the error message is the # result of no additional processes. This is attempted $RETRY times after # sleeping for $SLEEP seconds before execution is abandoned. FORK: { if ( defined( $pid = fork ) ) { return $pid; } elsif ( $! =~ /No more process/i ) { if ( ++$retry > ( $RETRY || 3 ) ) { croak( __PACKAGE__, '::Fork - Cannot fork process, retry count exceeded - ', $! ); } sleep ( $SLEEP || 5 ); redo FORK; } else { croak( __PACKAGE__, '::Fork - Cannot fork process - ', $! ); } } }