std::signal
std::signal
Defined in header | | |
---|---|---|
/*signal-handler*/* signal(int sig, /*signal-handler*/* handler | (1) | |
extern "C" using /*signal-handler*/ = void(int // exposition-only | (2) | |
Sets the error handler for sig
nal sig
. The sig
nal handler can be set so that default handling will occur, sig
nal 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: SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM defines signal types (macro constant) | SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM | defines signal types (macro constant) |
---|---|---|---|---|
SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM | defines signal types (macro constant) | |||
handler | - | the signal handler. This must be one of the following: SIG_DFL macro. The signal handler is set to default signal handler. SIG_IGN macro. The signal is ignored. pointer to a function. The signature of the function must be equivalent to the following: void fun(int sig | void fun(int sig | |
void fun(int sig | | |
SIG_DFL
macro. The signal handler is set to default signal handler.
void fun(int sig
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 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
, the behavior is undefined if the signal handler calls std::raise
.
If the signal handler is called NOT as a result of std::abort
or std::raise
, the behavior is undefined if.
- the signal handler calls any function within the standard library, except
On entry to the signal handler, the state of the floating-point environment and the values of all objects is unspecified, except for.
- objects of type
volatile
std::sig_atomic_t
On return from a signal handler, the value of any object modified by the signal handler that is not volatile
std::sig_atomic_t
or std::atomic
is undefined.
The behavior is undefined if std::signal
is used in a multithreaded program. It is not required to be thread-safe.
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
raise | runs the signal handler for particular signal (function) |
---|
| C documentation for signal |
| atomic_signal_fence (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.