信号 signal
参考:https://www.cnblogs.com/maxgongzuo/p/6372898.html
信号配置 Signal dispositions
每个信号都有一个配置,决定信号传递到进程时的行为。每个信号都有一个默认的配置,指定信号的默认操作,至于最终具体的操作,肯定是基于它的默认操作的。
Term
默认操作是终止进程
Ign
默认操作是忽略进程
Core
默认操作是终止进程,并 core dump
core dump
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做 Core Dump(中文有的翻译成“核心转储”)。除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
如果没有进行 core dump 的相关设置,默认是不开启的。可以通过ulimit -c
查看是否开启。如果输出为0
,则没有开启,需要执行ulimit -c unlimited
开启 core dump 功能。
Stop
默认操作是停止进程,后台休眠
Term 和 Stop 的区别:Term 终止进程,进程不存在;Stop 停止进程,进程还存在,可以通过 Cont 唤醒
Cont
默认操作是继续被停止的进程
标准信号 Standard signals
kill -l
或 trap -l
可以查看所有的系统信号
1 | lujinkai@Z510:~$ kill -l |
编号 1-31 是标准信号,我们只研究这些,后面的不研究,常用信号说明:
信号名是 SIG 后面的部分,大部分信号都能被捕获,SIGKILL 和 SIGSTOP 不能被捕获。
1) HUP
默认操作 Term,可捕获
本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一 session 内的各个作业, 这时它们与控制终端不再关联。
登录 Linux 时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出 Linux 登录时,前台进程组和后台有对终端输出的进程将会收到 SIGHUP 信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如 wget 能捕获 SIGHUP 信号,并忽略它,这样就算退出了 Linux 登录,wget 也 能继续下载。
此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
2) INT
默认操作 Term,可捕获
程序终止(interrupt)信号, 在用户键入 INTR 字符(通常是 Ctrl-C)时发出,用于通知前台进程组终止进程。
3) QUIT
默认操作 Core,可捕获
和 SIGINT 类似, 但由 QUIT 字符(通常是 Ctrl-)来控制. 进程在因收到 SIGQUIT 退出时会 core dump, 在这个意义上类似于一个程序错误信号。
9) KILL
默认操作 Term,不可捕获
杀掉进程,KILL 和 TERM 的区别在于此信号不能被捕获、阻塞或忽略,所以一旦接收到此信号的进程只能终止,而 TERM 可以被捕获,进程在捕获到 TERM 信号后,可以执行自定义操作,例如通知子进程关闭,清理资源等操作。
15) TERM
默认操作 Term,可捕获
终止进程,是 kill 默认传递的信号。