On Jun 18, 6:50 am, rvtol+use...@isolution.nl ("Dr.Ruud") wrote: > On 2011-06-17 05:34, C.DeRykus wrote: > > > > Ruud: > >> C.DeRykus: > >>> Ruud: > >>>> C.DeRykus: > >>>>> Another solution, not necessarily more elegant, but > >>>>> more familiar to most is an eval {} and alarm pair: > > >>>>> EVAL: { > >>>>> eval { > >>>>> local $SIG{ ALRM } = sub { die "alarm"; }; > >>>>> local $SIG{ USR1 } = sub { die "usr1" }; > >>>>> alarm $sleeptime; > >>>>> ... some long running operation here .... > >>>>> alarm 0; > >>>>> 1; > >>>>> } or do { > > >>>> Insert: > >>>> my $eval_error = $@ || "Zombie error!"; > > >>> Huh? If you insert that statement before doing 'alarm 0', > >>> then, there's a potential have a race condition with the > >>> alarm going off and terminating the entire program with > >>> "alarm clock" before you can even check $@. > > >> Realize that the alarm is then already reset (to the earlier setting) > >> because the localization gets out of scope. > > > No, that's not true. The localized signal handler gets > > reset but any alarm that is started in that scope will > > still be delivered to the current signal handler unless > > turned off. > > Right, but the word "alarm" in my sentence stood for "alarm signal > handler", so please re-read. > >
I'm sorry to have mis-read your response. With just a signal name, I always tend to interpret it narrowly as the signal itself and not the handler. > >>> eval { ... ; "foo" happens and sets $@='bar'; > >>> ... > >>> }; > >>> my $eval_error = $@ || "Zombie error!"; > >>> # alarm actually does go off now > >>> # and terminates program > >>> alarm 0; # too late > >>> .... > >>> Therefore you wouldn't want to insert any statement > >>> before turning off the alarm. > > >> Because the alarm signal is localized (to the eval{}), it is not active > >> in the do{}. > > > No, it's still active. In the case below, the alarm > > that was set inside the scope gets delivered to > > the default alarm handler. > > And my "alarm signal" was short again for "alarm signal handler". > > > On freebsd 8.2 for > > instance: > > > $ perl -e 'eval{ local $SIG{ALRM}=sub{die "foo"}; > > alarm 1};<>' > > Alarm clock: 14 > > > So the alarm that was launched in the eval {} scope > > is still active and, even though the localized handler > > goes out of scope, the delivery still occurs later to > > the default handler. > > Well, I hope I cleared up my bad phrasing. Should have been clear to me in that context what you were referring to. Turning off the undelivered alarm is good practice but I'll re-read the whole thread. -- Charles DeRykus . -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/