Program termination | |||||||||||||||||||||
| |||||||||||||||||||||
Unreachable control flow | |||||||||||||||||||||
(C23) | |||||||||||||||||||||
Communicating with the environment | |||||||||||||||||||||
| |||||||||||||||||||||
Memory alignment query | |||||||||||||||||||||
(C23) | |||||||||||||||||||||
Signals | |||||||||||||||||||||
| |||||||||||||||||||||
Signal types | |||||||||||||||||||||
Non-local jumps | |||||||||||||||||||||
Types | |||||||||||||||||||||
Defined in header <signal.h> | ||
void(*signal(int sig,void(*handler)(int)))(int); | ||
Sets the error handler for signalsig
. 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 whethersignal(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.
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 user defined function returns when handlingSIGFPE,SIGILL orSIGSEGV, the behavior is undefined.
If the signal handler is called as a result ofabort orraise, the behavior is undefined if the signal handler callsraise.
If the signal handler is called NOT as a result ofabort orraise (in other words, the signal handler isasynchronous), the behavior is undefined if
signal
with the first argument being the number of the signal currently handled (async handler can re-register itself, but not other signals).<stdatomic.h>
if the atomic arguments are lock-freeOn 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 notvolatilesig_atomic_t or lock-free atomic(since C11) is undefined.
The behavior is undefined ifsignal is used in a multithreaded program. It is not required to be thread-safe.
POSIX requires thatsignal
is thread-safe, andspecifies a list of async-signal-safe library functions that may be called from any signal handler.
Besidesabort
andraise
, POSIX specifies thatkill
,pthread_kill
, andsigqueue
generate synchronous signals.
POSIX recommendssigaction
instead ofsignal
, due to its underspecified behavior and significant implementation variations, regarding signal delivery while a signal handler is executed.
#include <signal.h>#include <stdio.h> volatilesig_atomic_t gSignalStatus; void signal_handler(int signal){ gSignalStatus= signal;} int main(void){ signal(SIGINT, signal_handler); printf("SignalValue: %d\n", gSignalStatus);printf("Sending signal: %d\n",SIGINT);raise(SIGINT);printf("SignalValue: %d\n", gSignalStatus);}
Output:
SignalValue: 0Sending signal: 2SignalValue: 2
runs the signal handler for particular signal (function)[edit] | |
C++ documentation forsignal |