Signals are a simple UNIX mechanism for controlling processes. A signal is a 5-bit message to a process that requires immediate attention. Each signal has associated with it a default action; for some signals, you can change this default action. Signals are generated by exceptions, which include:
Attempts to use illegal instructions
Certain kinds of mathematical operations
Window resize events
Predefined alarms
The user pressing an interrupt key on a terminal
Another program using the kill() l or killpg() system calls
A program running in the background attempting to read from or write to its controlling terminal
A child process calling exit or terminating abnormally
The system default may be to ignore the signal, to terminate the process receiving the signal (and, optionally, generate a core file), or to suspend the process until it receives a continuation signal. Some signals can be caught - that is, a program can specify a particular function that should be run when the signal is received. By design, UNIX supports exactly 31 signals. They are listed in the files /usr/include/signal.h and /usr/include/sys/signal.h. Table 27.4 contains a summary.
Signal Name | Number[7] | Key | Meaning[8] |
---|---|---|---|
SIGHUP | 1 | Hangup (sent to a process when a modem or network connection is lost) | |
SIGINT | 2 | Interrupt (generated by CTRL-C (Berkeley UNIX) or RUBOUT (System V). | |
SIGQUIT | 3 | * | Quit |
SIGILL | 4 | * | Illegal instruction |
SIGTRAP | 5 | * | Trace trap |
SIGIOT | 6 | * | I/O trap instruction; used on PDP-11 UNIX |
SIGEMT | 7 | * | Emulator trap instruction; used on some computers without floating-point hardware support |
SIGFPE | 8 | * | Floating-point exception |
SIGKILL | 9 | ! | Kill |
SIGBUS | 10 | * | Bus error (invalid memory reference, such as an attempt to read a full word on a half-word boundary) |
SIGSEGV | 11 | * | Segmentation violation (invalid memory reference, such as an attempt to read outside a process's memory map) |
SIGSYS | 12 | * | Bad argument to a system call |
SIGPIPE | 13 | Write on a pipe that has no process to read it | |
SIGALRM | 14 | Timer alarm | |
SIGTERM | 15 | Software termination signal (default kill signal) | |
SIGURG | 16 | @ | Urgent condition present |
SIGSTOP | 17 | +! | Stop process |
SIGTSTP | 18 | + | Stop signal generated by keyboard |
SIGCONT | 19 | @ | Continue after stop |
SIGCHLD | 20 | @ | Child process state has changed |
SIGTTIN | 21 | + | Read attempted from control terminal while process is in background |
SIGTTOU | 22 | + | Write attempted to control terminal while process is in background |
SIGIO | 23 | @ | Input/output event |
SIGXCPU | 24 | CPU time limit exceeded | |
SIGXFSZ | 25 | File size limit exceeded | |
SIGVTALRM | 26 | Virtual time alarm | |
SIGPROF | 27 | Profiling timer alarm | |
SIGWINCH | 28 | @ | tty window has changed size |
SIGLOST | 29 | Resource lost | |
SIGUSR1 | 30 | User-defined signal #1 | |
SIGUSR2 | 31 | User-defined signal #2 |
[7] The signal number varies on some systems.
[8] The default action for most signals is to terminate.
Key:
* | If signal is not caught or ignored, generates a core image dump. |
@ | Signal is ignored by default. |
+ | Signal causes process to suspend. |
! | Signal cannot be caught or ignored. |
Signals are normally used between processes for process control. They are also used within a process to indicate exceptional conditions that should be handled immediately (for example, floating-point overflows).