添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

常见Linux系统信号

信号 描述
1 SIGHUP 挂起进程
2 SIGINT 终止进程
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 尽可能终止进程
17 SIGSTOP 无条件停止进程,但不是终止进程
18 SIGTSTP 停止或暂停进程,但不终止进程
19 SIGCONT 继续运行停止的进程

默认情况下,bash shell会忽略收到的任何SIGQUIT(3)和SIGTERM(5)信号。但是bash shell会处理收到的SIGHUP(1)和SIGINT(2)信号。

如果bash shell收到了SIGHUP信号,比如当你要离开一个交互式shell,它就会退出。但在退出之前,它会将SIGHUP信号传给所有由该shell所启动的进程(包括正在运行的shell脚本)。

通过SIGINT信号,可以中断shell。Linux内核会停止为shell分配CPU处理时间。这种情况发生时,shell会将SIGINT信号传给所有由它所启动的进程,以此告知出现的状况。

bash shell允许用键盘上的组合键生成两种基本的Linux信号。

  • 中断进程
    Ctrl+C 组合键会生成SIGINT信号,并将其发送给当前在shell中运行的所有进程。
  • 暂停进程
    Ctrl+Z 组合键会生成一个SIGTSTP信号,停止shell中运行的任何进程。停止(stopping)进程跟终止(terminating)进程不同:停止进程会让程序继续保留在内存中,并能从上次停止的位置 继续运行。在16.4节中,你会了解如何重启一个已经停止的进程。

trap命令允许你来指定shell脚本要监看并从shell中拦截的Linux信号。如果脚本收到了trap命令中列出的信号,该信号不再由shell处理,而是交由本地处理。

命令格式: trap commands signals

#!/bin/bash
#实例,捕获信号
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
echo "This is a test script"
count=1
while [[ $count -le 10 ]]; do
	echo "Loop #$count"
	sleep 1
	count=$[ $count + 1 ]
echo "This is the end of the test script"

捕获脚本退出

除了在shell脚本中捕获信号,你也可以在shell脚本退出时进行捕获。
要捕获shell脚本的退出,只要在trap命令后加上EXIT信号就行。

#!/bin/bash
#实例 捕获信号并退出
trap "echo Goodbye..." EXIT
count=1
while [[ $count -le 10 ]]; do
	echo "Loop #$count"
	sleep 1
	count=$[ $count + 1 ]
echo "This is the end of the test script"

修改或移除捕获

#!/bin/bash
#修改捕获
trap "echo ' Sorry... Ctrl-C is trapped.'" SIGINT
count=1
while [[ $count -le 5 ]]; do
	echo "Loop #$count"
	sleep 1
	count=$[ $count + 1 ]
trap "echo ' I modified the trap!'" SIGINT
count=1
while [[ $count -le 5 ]]; do
	echo "Second Loop #$count"
	sleep 1
	count=$[ $count + 1 ]

修改了信号捕获之后,脚本处理信号的方式就会发生变化。但如果一个信号是在捕获被修改前接收到的,那么脚本仍然会根据最初的trap命令进行处理。
在这里插入图片描述
也可以删除已设置好的捕获。只需要在trap命令与希望恢复默认行为的信号列表之间加上 两个破折号就行了。

#!/bin/bash
#删除已设置好的捕获
trap "echo ' Sorry... Ctrl-C is trapped.'" SIGINT
count=1
while [[ $count -le 5 ]]; do
	echo "Loop #$count"
	sleep 1
	count=$[ $count + 1 ]
trap -- SIGINT
echo "I just removed the trap"
count=1
while [[ $count -le 5 ]]; do
	echo "Second Loop #$count"
	sleep 1
	count=$[ $count + 1 ]

移除信号捕获后,脚本按照默认行为来处理SIGINT信号,也就是终止脚本运行。但如果信 号是在捕获被移除前接收到的,那么脚本会按照原先trap命令中的设置进行处理。

常见Linux系统信号信号值描述1SIGHUP挂起进程2SIGINT终止进程3SIGQUIT停止进程9SIGKILL无条件终止进程15SIGTERM尽可能终止进程17SIGSTOP无条件停止进程,但不是终止进程18SIGTSTP停止或暂停进程,但不终止进程19SIGCONT继续运行停止的进程默认情况下,bash shell会忽略收到的任何SIGQUIT(3)和SIGTERM(5)信号。但是bash she Linux 内核需要对连接到计算机上的所有硬件设备进行管理,毫无疑问这是它的份内事。 如果要管理这些设备,首先得和它们互相通信才行,一般有两种方案可实现这种功能: l 轮询(polling) 内核定期对设备的状态进行查询,然后做出相应的处理; l 中断(interrupt) 硬件在需要的时候向内核发出信号(变内核主动为硬件主动)。 第一种方案会让内核做不少的无用功,因为轮询总会周期性的重复执行,大量地耗用CPU 时间,因此效率及其低下,所以一般都是采用第二种方案。 从物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器的输入 引脚上,然后再由中断控制器向处理器发送相应的信号处理器一经检测到该信号,便中断 自己当前正在处理的工作,转而去处理中断。此后,处理器会通知OS 已经产生中断。这 样,OS 就可以对这个中断进行适当的处理。不同的设备对应的中断不同,而每个中断都通 过一个唯一的数字标识,这些值通常被称为中断请求线 Linux信号机制基本上是从UNIX系统中继承过来的。早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是:    1.进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。    2.因此导致,...
在unix里,可能发生的每一种类型的事件都是由一个独立的信号来描述,每一个信号都是一个小的正整数,如: 名称    值     描述 SIGHUP  1      控制终端发现被挂起或控制进程死亡 SIGINT  2      键盘终端 SIGQUIT 3      来自键盘的退出信号 SIGKILL 9      杀死进程的信号 SIGALRM 14     定时时钟中断
11_信号SIGINT,SIGCHLD 文章目录11_信号SIGINT,SIGCHLD1.SIGINT 举例1.1(signal和信号^C)1.2(运行./mykill 进程号 快捷键说明号)2.SIGCHLD 举例 11_信号SIGINT,SIGCHLD 3.5.1.1、信号是内容受限(只是一个int型的数字)的一种异步通信机制 (1)信号的目的:用来通信(进程与进程之间的通信) (2)信号是异步的(对比硬件中断),信号好像就是一种软件中断。 (3)信号本质上...
Linux信号处理时机分为三种情况: 1. 同步处理:当一个进程被信号打断时,内核会立即停止它的执行,并将控制权交给信号处理程序。这种情况下,信号处理程序会替代进程的当前指令,完成信号处理,然后再返回原来的指令。 2. 异步处理:当一个进程正在执行时,收到一个信号,此时内核会通知该进程,进程可以选择忽略信号、执行默认操作或者执行一个信号处理程序。 3. 延迟处理信号可能会被延迟到进程执行完当前指令之后才被处理。这种情况下,内核会将信号标记为“待处理”,并在进程执行完当前指令之后,立即执行信号处理程序。