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...
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Eval/Fork lesson of the day
by graff (Chancellor) on May 15, 2002 at 03:45 UTC | |
by lestrrat (Deacon) on May 15, 2002 at 16:03 UTC | |
by graff (Chancellor) on May 15, 2002 at 17:28 UTC | |
Re: Eval/Fork lesson of the day
by theguvnor (Chaplain) on May 14, 2002 at 22:02 UTC | |
by Anonymous Monk on Jan 21, 2016 at 21:18 UTC | |
by Minok (Novice) on Sep 14, 2016 at 01:27 UTC | |
by tye (Sage) on Sep 14, 2016 at 16:09 UTC |
Back to
Meditations