信号是 UNIX 中所使用的进程通信的一种古老方法。它是在软件层次上对中断机制的一种模拟,是一种异步通信方式 。信号可以直接进行用户 空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无需知道该进程的状态。如 果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号传递被延迟,直到其 阻塞被取消时传递给进程。
使用 kill -l 指令可以列出本机系统所支持的所有信号列表 :
引用beyes@linux-beyes:~> kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
由上面可以看到,信号值在 32 之前的都有不同的名称,而信号值在 32 以后的都是用 SIGRTMIN 或 SIGRTMAX 开头,这就是两类典型的信号。前者是从 UNIX 系统中继承下来的信号,为不可靠信号( 也称为非实时信号 );后者是为了解决前面 “不可靠信号” 的问题而进行了更改和扩充的信号,称为“可靠信号”( 也称为实时信号 )。为什么之前的信号不可靠呢?这里先从信号的生命周期看起。
一 个完整的信号生命周期可以分为 3 个重要阶段,这 3 个阶段由 4 个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数:

上图中,相邻的两个事件间隔构成信号生命周期的一个阶段。要注意这里的信号处理有多种方式,一般是由内核完成,当有也可 以由用户进程来完成。
一个不可靠的处理过程是这样的:如果发现该信号已经在进程中注册,那么就忽略该信号。因此,若前一个信号还未注销又 产生了相同的信号就会产生信号丢失。而当可靠信号发送给一个进程时,不管该信号是否已经在进程中注册,都会被再注册一次,因此信号就不会丢失。所有可靠信 号都支持排队,而不可靠信号都不支持排队。
注意 :
这 里的信号的产生、注册、注销等都是指信号的内部实现机制,而不是信号的函数实现的。
用户进程对信号的响应可以有 3 种方式:
- 忽略信号,即对信号不做任何处理,但是有两个信号不能忽略,即 SIGKILL 及 SIGSTOP
- 捕捉信号,定义信号处理函数,当信号发生时,执行相应的处理函数。
- 执行缺省操 作,Linux 对每种信号都规定了默认操作。