%SIG, $SIG{expr}
- %SIG
The hash
%SIGcontains signal handlers for signals. For example:sub handler { # 1st argument is signal name my($sig) = @_; print "Caught a SIG$sig--shutting down\n"; close(LOG); exit(0); } $SIG{'INT'} = \&handler; $SIG{'QUIT'} = \&handler; ... $SIG{'INT'} = 'DEFAULT'; # restore default action $SIG{'QUIT'} = 'IGNORE'; # ignore SIGQUIT
Using a value of
'IGNORE'usually has the effect of ignoring the signal, except for theCHLDsignal. See perlipc for more about this special case.Here are some other examples:
$SIG{"PIPE"} = "Plumber"; # assumes main::Plumber (not recommended) $SIG{"PIPE"} = \&Plumber; # just fine; assume current Plumber $SIG{"PIPE"} = *Plumber; # somewhat esoteric $SIG{"PIPE"} = Plumber(); # oops, what did Plumber() return??
Be sure not to use a bareword as the name of a signal handler, lest you inadvertently call it.
If your system has the
sigaction()function then signal handlers are installed using it. This means you get reliable signal handling.The default delivery policy of signals changed in Perl 5.8.0 from immediate (also known as "unsafe") to deferred, also known as "safe signals". See perlipc for more information.
Certain internal hooks can be also set using the
%SIGhash. The routine indicated by$SIG{__WARN__}is called when a warning message is about to be printed. The warning message is passed as the first argument. The presence of a__WARN__hook causes the ordinary printing of warnings toSTDERRto be suppressed. You can use this to save warnings in a variable, or turn warnings into fatal errors, like this:local $SIG{__WARN__} = sub { die $_[0] }; eval $proggie;
As the
'IGNORE'hook is not supported by__WARN__, you can disable warnings using the empty subroutine:local $SIG{__WARN__} = sub {};
The routine indicated by
$SIG{__DIE__}is called when a fatal exception is about to be thrown. The error message is passed as the first argument. When a__DIE__hook routine returns, the exception processing continues as it would have in the absence of the hook, unless the hook routine itself exits via agoto, a loop exit, or adie(). The__DIE__handler is explicitly disabled during the call, so that you can die from a__DIE__handler. Similarly for__WARN__.Due to an implementation glitch, the
$SIG{__DIE__}hook is called even inside aneval(). Do not use this to rewrite a pending exception in$@, or as a bizarre substitute for overridingCORE::GLOBAL::die(). This strange action at a distance may be fixed in a future release so that$SIG{__DIE__}is only called if your program is about to exit, as was the original intent. Any other use is deprecated.__DIE__/__WARN__handlers are very special in one respect: they may be called to report (probable) errors found by the parser. In such a case the parser may be in inconsistent state, so any attempt to evaluate Perl code from such a handler will probably result in a segfault. This means that warnings or errors that result from parsing Perl should be used with extreme caution, like this:require Carp if defined $^S; Carp::confess("Something wrong") if defined &Carp::confess; die "Something wrong, but could not load Carp to give backtrace... To see backtrace try starting Perl with -MCarp switch";
Here the first line will load
Carpunless it is the parser who called the handler. The second line will print backtrace and die ifCarpwas available. The third line will be executed only ifCarpwas not available.Having to even think about the
$^Svariable in your exception handlers is simply wrong.$SIG{__DIE__}as currently implemented invites grievous and difficult to track down errors. Avoid it and use anEND{}or CORE::GLOBAL::die override instead.See die(), warn(), eval(), and warnings for additional information.