C signal handling
C standard library |
---|
General topics |
Miscellaneous headers |
In the C Standard Library, signal processing defines how a program handles various signals while it executes. A signal can report some exceptional behavior within the program (such as division by zero), or a signal can report some asynchronous event outside the program (such as someone striking an interactive attention key on a keyboard).
Standard signals
The C standard defines only 6 signals. They are all defined in signal.h
header (csignal
header in C++):[1]
SIGABRT
- abnormal termination.SIGFPE
- floating point exception.SIGILL
- invalid instruction.SIGINT
- interactive attention request sent to the program.SIGSEGV
- invalid memory access.SIGTERM
- termination request sent to the program.
Additional signals may be specified in the signal.h
header by the implementation. For example, Unix and Unix-like operating systems (such as Linux) define more than 15 additional signals.[2]
Handling
A signal can be generated by calling raise()
or kill()
system calls. raise()
sends a signal to the current process, kill()
sends a signal to a specific process.
A signal handler can be specified for all but two signals (SIGKILL and SIGSTOP cannot be caught, blocked or ignored). A signal handler is a function which is called by the target environment when the corresponding signal occurs. The target environment suspends execution of the program until the signal handler returns or calls longjmp()
. For maximum portability, an asynchronous signal handler should only:
- make successful calls to the function
signal()
- assign values to objects of type volatile
sig_atomic_t
- return control to its caller
If the signal reports an error within the program (and the signal is not asynchronous), the signal handler can terminate by calling abort()
, exit()
, or longjmp()
.
Functions
Function | Description |
---|---|
raise |
artificially raises a signal |
signal |
sets the action taken when the program receives a specific signal |
Example usage
#include <signal.h> #include <stdio.h> #include <stdlib.h> static void catch_function(int signo) { puts("Interactive attention signal caught."); } int main(void) { if (signal(SIGINT, catch_function) == SIG_ERR) { fputs("An error occurred while setting a signal handler.\n", stderr); return EXIT_FAILURE; } puts("Raising the interactive attention signal."); if (raise(SIGINT) != 0) { fputs("Error raising the signal.\n", stderr); return EXIT_FAILURE; } puts("Exiting."); return EXIT_SUCCESS; }
See also
References
- ↑ ISO/IEC 9899:1999 specification. p. 258, § 7.14 Signal handling.
- ↑ "The Open Group Base Specifications Issue 6 - signal.h - signals". Retrieved 10 January 2012.