|
|
Defined in header <csignal> | ||
/* signal-handler */* signal(int sig,/* signal-handler */* handler); | (1) | |
extern"C"using/* signal-handler */=void(int); | (2) | (exposition only*) |
Changes handling of the signalsig. Depending onhandler, the signal can be ignored, set to default, or handled by a user-defined function.
When signal handler is set to a function and a signal occurs, it is implementation defined whetherstd::signal(sig,SIG_DFL) will be executed immediately before the start of signal handler. Also, the implementation can prevent some implementation-defined set of signals from occurring while the signal handler runs.
For some of the signals, the implementation may callstd::signal(sig,SIG_IGN) at the startup of the program. For the rest, the implementation must callstd::signal(sig,SIG_DFL).
(Note: POSIX introducedsigaction
to standardize these implementation-defined behaviors)
Contents |
sig | - | the signal to set the signal handler to. It can be an implementation-defined value or one of the following values:
| ||||||
handler | - | the signal handler. This must be one of the following:
|
Previous signal handler on success orSIG_ERR on failure (setting a signal handler can be disabled on some implementations).
The following limitations are imposed on the user-defined function that is installed as a signal handler.
If the signal handler is called NOT as a result ofstd::abort orstd::raise (asynchronous signal), the behavior is undefined if
| (until C++17) |
Aplain lock-free atomic operation is an invocation of a functionf from<atomic> or<stdatomic.h>(since C++23), such that:
The behavior is undefined if any signal handler performs any of the following:
| (since C++17) |
If the user defined function returns when handlingSIGFPE,SIGILL,SIGSEGV or any other implementation-defined signal specifying a computational exception, the behavior is undefined.
If the signal handler is called as a result ofstd::abort orstd::raise (synchronous signal), the behavior is undefined if the signal handler callsstd::raise.
On entry to the signal handler, the state of thefloating-point environment and the values of all objects is unspecified, except for
On return from a signal handler, the value of any object modified by the signal handler that is notvolatilestd::sig_atomic_t or lock-freestd::atomic is indeterminate. | (until C++14) | ||
A call to the function If a signal handler is executed as a result of a call tostd::raise (synchronously), then the execution of the handler issequenced-after the invocation of Two accesses to the same object of typevolatilestd::sig_atomic_t do not result in a data race if both occur in the same thread, even if one or more occurs in a signal handler. For each signal handler invocation, evaluations performed by the thread invoking a signal handler can be divided into two groups A and B, such that no evaluations in Bhappen-before evaluations in A, and the evaluations of suchvolatilestd::sig_atomic_t objects take values as though all evaluations in Ahappened-before the execution of the signal handler and the execution of the signal handlerhappened-before all evaluations in B. | (since C++14) |
POSIX requires thatsignal
is thread-safe, andspecifies a list of async-signal-safe library functions that may be called from any signal handler.
Signal handlers are expected to haveC linkage and, in general, only use the features from the common subset of C and C++. However, common implementations allow a function with C++ linkage to be used as a signal handler.
#include <csignal>#include <iostream> namespace{volatilestd::sig_atomic_t gSignalStatus;} void signal_handler(int signal){ gSignalStatus= signal;} int main(){// Install a signal handler std::signal(SIGINT, signal_handler); std::cout<<"SignalValue: "<< gSignalStatus<<'\n';std::cout<<"Sending signal: "<<SIGINT<<'\n';std::raise(SIGINT);std::cout<<"SignalValue: "<< gSignalStatus<<'\n';}
Possible output:
SignalValue: 0Sending signal: 2SignalValue: 2
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3756 | C++17 | it was unclear whetherstd::atomic_flag is signal-safe | it is |
runs the signal handler for particular signal (function)[edit] | |
(C++11) | fence between a thread and a signal handler executed in the same thread (function)[edit] |
C documentation forsignal |