CentOS 7.2
与其他进程间通信方式(例如管道、共享内存等)相比,信号所能传递的信息比较粗糙,只是一个整数。但正是由于传递的信息量少,信号也便于管理和使用,可以用于系统管理相关的任务,例如通知进程终结、中止或者恢复等。 每种信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD、SIGINT等,它们在系统头文件
信号传递的过程:1、内核中针对每一个进程都有一个表来保存信号。2、当内核需要将信号传递给某个进程时,就在该进程对应的表中写入信号,这样就生成了信号。3、当该进程由用户态陷入内核态,再次切换到用户态之前,会查看表中的信号。如果有信号,进程就会首先执行信号对应的操作,此时叫做执行信号。4、从生成信号到将信号传递给对应进程这段时间,信号处于等待状态。5、我们可以编写代码,让进程阻塞(block)某些信号,也就是让这些信号始终处于等待的状态,直到进程取消阻塞(unblock)或者忽略信号。
下面为一些常见信号:
通过 kill -l 命令可以查看系统支持的所有信号
每种信号都会有一个默认动作。默认动作就是脚本或程序接收到该信号所做出的默认操作。常见的默认动作有终止进程、退出程序、忽略信号、重启暂停的进程等,不同的Linux发行版支持的信号可能不同。
还可以通过 kill 命令发送信号,语法为:kill -signal pid如向一个ping进程发送信号类型为1的信号,会挂起(终止)ping进程
强制杀死进程可以用 -9
通常情况下,直接终止进程并不是我们所希望的。例如,按下
用户程序可以通过C/C++等代码捕获信号,这将在Linux C编程中进行讲解,这里仅介绍如果通过Linux命令捕获信号。 通过 trap 命令就可以捕获信号,语法为: trap commands signals
捕获到信号后,可以有三种处理:1.执行一段脚本来做一些处理工作,例如清理临时文件;2.接受(恢复)信号的默认操作;3.忽略当前信号。
脚本捕获到终止信号后一个常见的动作就是清理临时文件。例如: trap 'echo trap sign -2; exit' 2当用户按下
如果 trap 命令的 commands 为空,将会忽略接收到的信号,即不做任何处理,也不执行默认动作。例如:trap '' 2也可以同时忽略多个信号:trap '' 1 2 3 15注意:必须被引号包围,-9信号无法被忽略哈!
如果希望改变信号的默认动作后再次恢复默认动作,那么省略 trap 命令的 commands 即可,例如: trap 1 2