http://book.51cto.com/art/201604/510323.htm
5.3.2 信号(1)
《Linux环境编程图文指南》本书内容翔实,囊括了Linux系统操作细节,Shell脚本编程精要,各种编程环境所需要解决的技术难点,以及在Linux环境下的C语言编程技术、并发编程技术和音/视频编程等核心内容。本节为大家介绍信号。
-
作者:林世霖/钟锦辉/李建辉来源:电子工业出版社|2016-04-28 18:30
沙龙活动 | 去哪儿、陌陌、ThoughtWorks在自动化运维中的实践!10.28不见不散!
5.3.2 信号(1)
信号是一种比较特殊的IPC,大部分的信号是异步的。换句话讲,一般情况下,进程什么时候会收到信号、收到什么信号是无法事先预料的(除了某几个特殊的信号之外),信号的到来就像你家门铃响起一样,你不知道它什么时候会响。
先来看看Linux系统中,都有哪些信号,如表5-8所示。
可以看到,Linux系统有许多信号,其中前面31个信号都有一个特殊的名字,对应一个特殊的事件。例如,1号信号SIGHUP(Signal Hang UP),表示每当系统中的一个控制终端被关闭(即挂断,Hang Up)时,即会产生这个信号,有时会将它们称为非实时信号,这些信号都是从UNIX系统继承下来的,它们还有个名称叫"不可靠信号",它们有如下特点。
表5-8 Linux系统的信号
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 SGIVTALRM | 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-9 | 64 SIGRTMAX |
|
|
|
(1)非实时信号不排队,信号的响应会相互嵌套。
(2)如果目标进程没有及时响应非实时信号,那么随后到达的该信号将会被丢弃。
(3)每一个非实时信号都对应一个系统事件,当这个事件发生时,将产生这个信号。
(4)如果进程的挂起信号中含有实时和非实时信号,那么进程优先响应实时信号并会从大到小依次响应,而非实时信号没有固定的次序。
后面的31个信号(从SIGRTMIN[34] 到 SIGRTMAX[64])是Linux系统新增的实时信号,也称为"可靠信号",这些信号的特点如下。
(1)实时信号的响应次序按接收顺序排队,不嵌套。
(2)即使相同的实时信号被同时发送多次,也不会被丢弃,而会依次逐个响应。
(3)实时信号没有特殊的系统事件与之对应。
上述特征在后面介绍完信号相关核心的API之后,都可以一一验证。表5-9所示是非实时信号的详细介绍。
表5-9 信号的值、默认响应动作以及产生的原因
信 号 | 值 | 默认动作 | 备注 |
SIGHUP | 1 | 终止 | 控制终端被关闭时产生 |
SIGINT | 2 | 终止 | 从键盘按键产生的中断信号(如Ctrl+C) |
SIGQUIT | 3 | 终止并产生转储文件 | 从键盘按键产生的退出信号(如Ctrl+\) |
SIGILL | 4 | 终止并产生转储文件 | 执行非法指令时产生 |
SIGTRAP | 5 | 终止并产生转储文件 | 遇到进程断点时产生 |
SIGABRT | 6 | 终止并产生转储文件 | 调用系统函数abort( )时产生 |
SIGBUS | 7 | 终止并产生转储文件 | 总线错误时产生 |
SIGFPE | 8 | 终止并产生转储文件 | 处理器出现浮点运算错误时产生 |
SIGKILL | 9 | 终止 | 系统杀戮信号 |
SIGUSR1 | 10 | 终止 | 用户自定义信号 |
SIGSEGV | 11 | 终止并产生转储文件 | 访问非法内存时产生 |
续表
信 号 | 值 | 默认动作 | 备注 |
SIGUSR2 | 12 | 终止 | 用户自定义信号 |
SIGPIPE | 13 | 终止 | 向无读者的管道输入数据时产生 |
SIGALRM | 14 | 终止 | 定时器到时间时产生 |
SIGTERM | 15 | 终止 | 系统终止信号 |
SIGSTKFLT | 16 | 终止 | 已废弃 |
SIGCHLD | 17 | 忽略 | 子进程暂停或终止时产生 |
SIGCONT | 18 | 恢复运行 | 系统恢复运行信号 |
SIGSTOP | 19 | 暂停 | 系统暂停信号 |
SIGTSTP | 20 | 暂停 | 由控制终端发起的暂停信号 |
SIGTTIN | 21 | 暂停 | 后台进程发起输入请求时控制终端产生该信号 |
SIGTTOU | 22 | 暂停 | 后台进程发起输出请求时控制终端产生该信号 |
SIGURG | 23 | 忽略 | 套接字上出现紧急数据时产生 |
SIGXCPU | 24 | 终止并产生转储文件 | 处理器占用时间超出限制值时产生 |
SIGXFSZ | 25 | 终止并产生转储文件 | 文件尺寸超出限制值时产生 |
SIGVTALRM | 26 | 终止 | 由虚拟定时器产生 |
SIGPROF | 27 | 终止 | profiling 定时器到时间时产生 |
SIGWINCH | 28 | 忽略 | 窗口大小变更时产生 |
SIGIO | 29 | 终止 | I/O变得可用时产生 |
SIGPWR | 30 | 终止 | 启动失败时产生 |
SIGUNUSED | 31 | 终止并产生转储文件 | 同SIGSYS |
对以上信号,需要着重注意如下问题。
(1)表5-6中罗列出来的信号的"值",在x86、PowerPC和ARM平台下是有效的,但是别的平台的信号值也许和表5-9的值不一致。
(2)"备注"中注明的事件发生时会产生相应的信号,但并不是说该信号的产生就一定发生了这个事件。事实上,任何进程都可以使用函数kill( )来产生任何信号。
(3)信号SIGKILL和SIGSTOP是两个特殊的信号,它们不能被忽略、阻塞或捕捉,只能按默认动作来响应。换句话说,除了这两个信号之外的其他信号,接收信号的目标进程按照如下顺序做出反应。
① 如果该信号被阻塞,那么将该信号挂起,不对其做任何处理,等到解除对其阻塞为止。否则进入第②步。
② 如果该信号被捕捉,那么进一步判断捕捉的类型:
如果设置了响应函数,那么执行该响应函数。
如果设置为忽略,那么直接丢弃该信号。
否则进入第③步。
③ 执行该信号的默认动作。
对信号有了初步的认识之后,下面分几部分来阐述这种通信机制。
喜欢的朋友可以添加我们的微信账号: