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...