The <csignal>
header is the C++ version of the standard C <signal.h>
header. It declares functions
and macros related to signal handling.
A signal is a condition that can arise during
program execution. A signal can originate by an explicit call to
raise
or abort
, from external sources (such as the user
interrupting the program), or from internal events (such as
floating-point errors or memory violations). Each signal has a
handler, which is a function that the C++ library
calls when a signal occurs (called raising the
signal).
Signals are identified by integers. A program can establish
different handlers for different signal numbers. You can choose to
ignore a signal by using SIG_IGN
as
the signal handler. If the signal is raised, no handler is called, and
the program continues. Each signal also has a default handler (SIG_DFL
). When a program starts, every signal
number is initialized with SIG_IGN
or
SIG_DFL
. The details are
implementation-defined.
You can set your own handler for any signal by calling the
signal
function. A handler is a
function that takes one parameter: the signal number. The signal handler
function is limited in what it can do. Unless a signal is raised by an
explicit call to raise
or abort
, the only useful thing the handler can
do is to set a global flag. The type of the flag must be sig_atomic_t
.
The standard defines a basic set of signals, and an implementation is free to define additional signals. On the other hand, an implementation is not required to raise any signals. Remember that arithmetic overflow, pointer violations, and the like result in undefined behavior. (See Chapter 4.) Thus, an implementation is free to terminate a program immediately, ignore the error, raise a signal, or do anything else. Some signals are meant to reflect external events, such as the user terminating the program. How the user terminates a program is likewise implementation-defined.
Unix and Unix-like operating systems have much more extensive
signal-handling facilities. The <csignal>
handler as documented in this
section is portable to all hosted C++ environments, regardless of
operating system, although the portable behavior is limited. Most uses
of <csignal>
in real programs
take advantage of additional, nonstandard capabilities. Consult your
compiler's and library's documentation for details.