signal() - Unix, Linux System Call
signal - ANSI C signal handling
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal() system call installs a new signal handler for the signal with number
signum. The signal handler is set to
sighandler which may be a user specified function, or either
Upon arrival of a signal with number
signum the following happens.
If the corresponding handler is set to
SIG_IGN, then the signal is ignored.
If the handler is set to
SIG_DFL, then the default action associated with the signal (see
Finally, if the handler is set to a function
sighandler then first either the handler is reset to SIG_DFL
or an implementation-dependent blocking of the signal
is performed and next
sighandler is called with argument
Using a signal handler function for a signal
is called "catching the signal".
SIGSTOP cannot be caught or ignored.
signal() function returns the previous value of the signal handler, or
SIG_ERR on error.
The original Unix
signal() would reset the handler to SIG_DFL, and System V
(and the Linux kernel and libc4,5) does the same.
On the other hand, BSD does not reset the handler, but blocks
new instances of this signal from occurring during a call of the handler.
The glibc2 library follows the BSD behaviour.
If one on a libc5 system includes
<bsd/signal.h> instead of
signal() is redefined as
__bsd_signal and signal has the BSD semantics. This is not recommended.
If one on a glibc2 system defines a feature test
macro such as
_XOPEN_SOURCE or uses a separate
sysv_signal function, one obtains classical behaviour. This is not recommended.
Trying to change the semantics of this call using
defines and includes is not a good idea. It is better to avoid
signal() altogether, and use
The effects of this call in a multi-threaded process are unspecified.
handler must be very careful, since processing elsewhere was interrupted
at some arbitrary point. POSIX has the concept of "safe function".
If a signal interrupts an unsafe function, and
handler calls an unsafe function, then the behavior is undefined. Safe
functions are listed explicitly in the various standards.
The POSIX.1-2003 list is
According to POSIX, the behaviour of a process is undefined after it
SIGFPE, SIGILL, or
SIGSEGV signal that was not generated by the
Integer division by zero has undefined result.
On some architectures it will generate a
(Also dividing the most negative integer by -1 may generate
SIGFPE.) Ignoring this signal might lead to an endless loop.
for details on what happens when
SIGCHLD is set to
The use of
sighandler_t is a GNU extension.
Various versions of libc predefine this type; libc4 and libc5 define
SignalHandler, glibc defines
sig_t and, when
_GNU_SOURCE is defined, also