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).