std::signal
| Defined in header <csignal> | ||
|---|---|---|
| /*signal-handler*/* signal(int sig, /*signal-handler*/* handler); | (1) | |
| extern "C" using /*signal-handler*/ = void(int); // exposition-only | (2) | 
Sets the handler for signal sig. The signal handler can be set so that default handling will occur, signal is ignored, or a user-defined function is called.
When signal handler is set to a function and a signal occurs, it is implementation defined whether std::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 call std::signal(sig, SIG_IGN) at the startup of the program. For the rest, the implementation must call std::signal(sig, SIG_DFL).
(Note: POSIX introduced sigaction to standardize these implementation-defined behaviors).
Parameters
| 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: 
 
 | 
Return value
Previous signal handler on success or SIG_ERR on failure (setting a signal handler can be disabled on some implementations).
Signal handler
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 of  
 | (until C++17) | 
| The behavior is undefined if any signal handler performs any of the following: 
 | (since C++17) | 
If the user defined function returns when handling SIGFPE, 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 of std::abort or std::raise (synchronous signal), the behavior is undefined if the signal handler calls std::raise.
| On entry to the signal handler, the state of the floating-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 not  | (until C++14) | 
| A call to the function  If a signal handler is executed as a result of a call to  Two accesses to the same object of type  | (since C++14) | 
Notes
POSIX requires that signal is thread-safe, and specifies a list of async-signal-safe library functions that may be called from any signal handler.
Signal handlers are expected to have C linkage and, in general, only use the features from the common subset of C and C++. It is implementation-defined if a function with C++ linkage can be used as a signal handler.
Example
#include <csignal>
#include <iostream>
 
namespace
{
  volatile std::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: 0 Sending signal 2 SignalValue: 2
See also
| runs the signal handler for particular signal (function) | |
| (C++11) | fence between a thread and a signal handler executed in the same thread (function) | 
    © cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
    http://en.cppreference.com/w/cpp/utility/program/signal