signal信号是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

1、常见信号

 使用kill -l命令就可以查看所有的信号,常见信号如下表:

信号名

信号编号

产生原因

默认处理方式

SIGHUP

1

关闭终端

终止

SIGINT

2

ctrl + c

终止

SIGQUIT

3

ctrl + \

终止+产生1个转储文件

SIGABRT

6

abort()函数

终止+转储

SIGPE

8

算术错误

终止

SIGKILL

9

kill -9 pid

终止,

不可捕获/忽略

SIGUSR1

10

自定义

忽略

SIGSEGV

11

段错误

终止+产生1个转储文件

SIGUSR2

12

自定义

忽略

SIGALRM

14

alarm()函数

终止

SIGTERM

15

kill pid

终止(可以被忽略)

SIGCHLD

17

子状态变化

忽略

SIGSTOP

19

ctrl + z

暂停,

不可捕获/忽略

2、发送信号

可以将信号传递给程序或脚本。当按下ctrl+c键时,SIGINT将被发送到脚本,并按照定义的默认处理方式脚本终止。传递信号的另一种常用方法是使用kill命令,其语法如下所示:

$ kill -signal pid

signal是要传递的信号的数字或名称,pid是信号应该发送到的进程ID。

例如,

如果要向一个进程发送kill信号,可以使用以下命令

$ kill -9 1231

kill -9代表的信号是SIGKILL,表示进程被终止,需要立即退出。进程ID为1231进程将退出。

3、捕获的信号

执行shell程序期间,当在终端上按ctrl+c或Break键时,通常该程序会立即终止,命令提示符会返回。这种做法是不推荐的,可能会留下一堆不会被清理的临时文件。

如果要捕获信号进行处理,可以使用trap命令:

$ trap command signals

command可以是Linux命令,或者是用户定义的函数等,signal可以是需要捕获信号的列表。

1)清理临时文件

捕获脚本中止信号,删除临时文件,然后在退出:

$ trap "rm -f /path/to/your/file  exit" 2

捕获信号1或2进行处理:

$ trap "rm -f /path/to/your/file  exit" 1 2

注意rm后面的exit命令是必要的,因为如果没有它,程序将在接收到信号时停止执行时继续执行。

2)忽略信号

如果为trap列出的命令为空,则接收到指定的信号时将被忽略。

例如,

$ trap '' 2

可以通过以下方式指定多个需要忽略的信号。

例如,

$ trap '' 1 2 3 15

注意:如果忽略一个信号,所有子shell程序也会忽略该信号。如果指定了接收信号时要采取的操作,则所有的子shell在接收到该信号时,还是采取默认操作。

3)恢复信号的默认操作

之前捕获的操作,如需要重置为默认操作,可以使用trap命令:

例如,

$ trap 1 2 3 15

注意:在Shell脚本中不能捕获所有信号,像TERM、KILL之类的信号是无法被捕获的。