in reply to Re^2: Setting signal handlers considered unsafe?
in thread Setting signal handlers considered unsafe?

I'm no master of perlguts either, but it occurs to me that there are two places where you are vulnerable to signal changes: 1. when you set the localized handler, 2. when the localization goes out of scope and the old handler is installed.

Your code traps only one of the two vulnerable points.

What happens if you do:

#!/usr/bin/perl use warnings FATAL => qw( all ); use strict; use POSIX qw( :signal_h ); $SIG{ALRM} = sub { print "SIGARLM: main handler\n" }; sub f { my $sigset = POSIX::SigSet->new; my $blockset = POSIX::SigSet->new( SIGALRM ); my $old_handler = $SIG{ALRM}; # Install new handler sigprocmask(SIG_BLOCK, $blockset, $sigset ); $SIG{ALRM} = sub { print "SIGALRM\n" }; # line 15 sigprocmask(SIG_SETMASK, $sigset ); # spin a bit. my $x; $x = $_ for 1..10; # Restore old handler. sigprocmask(SIG_BLOCK, $blockset, $sigset ); $SIG{ALRM} = $old_handler; sigprocmask(SIG_SETMASK, $sigset ); } if (fork) { # parent f while 1; } else { # child sleep 1; print "child starting\n"; 1 while kill ALRM => getppid; }


TGI says moo