signal
Defined in header
<signal.h>
|
||
void (*signal( int sig, void (*handler) (int))) (int);
|
||
Sets the error handler for signal sig
. The signal handler can be set so that default handling will occur, signal is ignored, or an user-defined function is called.
When signal handler is set to a function and a signal occurs, it is implementation defined whether signal(sig, SIG_DFL) will be executed immediately before the start of signal handler. Also, the implementation can prevent some implementation-defined set af signals from occurring while the signal handler runs.
Contents |
[edit] 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:
|
[edit] Return value
Previous signal handler on success or SIG_ERR on failure (setting a signal handler can be disabled on some implementations).
[edit] Signal handler
The following limitations are imposed on the user-defined function that is installed as a signal handle
If the user defined function returns when handling SIGFPE, SIGILL or SIGSEGV, the behavior is undefined.
If the signal handler is called as a result of abort or raise, the behavior is undefined if the signal handler calls raise.
If the signal handler is called NOT as a result of abort or raise, the behavior is undefined if
- the signal handler calls any function within the standard library, except abort, _Exit, quick_exit, or signal with the first argument not being the number of the signal currently handled.
- the signal handler refers to any object with static or thread-local(since C11) storage duration that is not lock-free atomic(since C11) or volatile std::sig_atomic_t.
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 sig_atomic_t
- objects of lock-free atomic types (since C11)
- side effects made visible through atomic_signal_fence (since C11)
On return from a signal handler, the value of any object modified by the signal handler that is not volatile sig_atomic_t or lock-free atomic(since C11) is undefined.
The behavior is undefined if signal is used in a multithreaded program. It is not required to be thread-safe.
[edit] 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.
[edit] Example
#include <stdio.h> #include <signal.h> /* A user-defined signal handler can process one or more signals. */ static void signal_handler(int signo) { switch(signo) { case SIGABRT : puts("Process SIGABRT signal here."); break; case SIGFPE : puts("Process SIGFPE signal here."); break; case SIGILL : puts("Process SIGILL signal here."); break; case SIGINT : puts("Process SIGINT signal here."); break; case SIGSEGV : puts("Process SIGSEGV signal here."); break; case SIGTERM : puts("Process SIGTERM signal here."); break; } /* some cleanup here */ /* exit(signo); */ } int main(void) { /* Register a user-defined signal handler. */ signal(SIGABRT, signal_handler); signal(SIGFPE, signal_handler); signal(SIGILL, signal_handler); signal(SIGINT, signal_handler); signal(SIGSEGV, signal_handler); signal(SIGTERM, signal_handler); /* Raise a signal. */ raise(SIGABRT); raise(SIGFPE); raise(SIGILL); raise(SIGINT); raise(SIGSEGV); raise(SIGTERM); return 0; }
Output:
Process SIGABRT signal here. Process SIGFPE signal here. Process SIGILL signal here. Process SIGINT signal here. Process SIGSEGV signal here. Process SIGTERM signal here.
[edit] See also
runs the signal handler for particular signal (function) |
|
C++ documentation for signal
|