Here's another gotcha that bit me just yesterday, that, in retrospect seems so obvious:

sub main_code { while(1) { eval{ fork_and_do_stuff() }; print STDERR "error, but we go on anyways\n"; } } sub fork_and_do_stuff { my $pid = fork if( $pid == 0 ) { ## simplified... do_stuff(); exit 1; } }

So what happens if you die() within do_stuff() ? The control would actually go to the eval block enclosing the fork_and_do_stuff() call! I've inadvertantly a child process that would execute the parent code.

That obviously sucks.

The solution is to put yet another eval block in the child code:

sub fork_and_do_stuff { my $pid = fork if( $pid == 0 ) { eval{ do_stuff() }; exit 1; } }

After this, I'm definitely going to be in the habit of putting all forked code in some sort of eval block to make sure that I can safely wrap the forking code in another eval block...