原文地址:linux系统信号简介 – 无敌牛
欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等
介绍
信号是一种重要的进程间通讯方式,这些信号有的有特定的用法,有的可作为扩展和自定义使用。并且大多数信号是可以被重新定义处理函数的。只有两个信号 SIGKILL 和 SIGSTOP 是不可以被捕捉、忽略和阻塞的,这是为了操作系统更好的控制进程和系统资源,防止滥用信号,确保系统的稳定性。此篇文章逐一解释一下每一个信号的作用。
可以用系统指令:kill -l 查看系统支持的信号,输出内容如下:
可以看出,linux 系统一般支持 1-31、34-64 共62个信号。其中:
1-31 是传统信号,这些信号在Unix和类Unix操作系统中是标准化的,每个信号都有其特定的用途和行为。
34-64 是实时信号,用于应用程序之间自定义的进程间通信。实时信号的主要特点是它们支持排队,这意味着如果多个相同类型的实时信号被发送给同一个接收者,接收者会按顺序接收到每一个信号,而不会丢失任何信号。相比之下,传统信号如果多次发送,则可能只会接收到一次。另外它们比传统信号具有更高的优先级。
信号解释
写了一小段代码,来逐一测试进程接收到信号后,默认的处理方式。测试不同的信号,把下边的代码中 SIGHUP 替换掉就可以了。可通过指令:gcc -o e_tsig1 tsig1.c 编译代码。操作系统发行版不一样,默认处理方式可能会不一样,但是不会相差太多。代码如下:
// gcc -o e_tsig1 tsig1.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
int main() {
unsigned int mypid = 0 ;
printf("my pid is :%u\n", (mypid = getpid()) ) ;
kill(mypid, SIGHUP) ;
while(1) {
printf("still running %u\n", mypid) ;
sleep(1) ;
}
}
SIGHUP 1 :Hangup 终端挂断信号,通常在终端连接中断、用户从系统注销、网络连接断开时产生。
系统默认处理方式:终止进程。默认处理程序测试:
通常情况下,捕捉此信号,重新处理函数,用来重新加载程序配置使用。systemctl reload xxxx.service 默认就是发送的此信号,这就需要接收信号的进程响应此信号,重写信号处理函数。
SIGINT 2 :Interrupt 中断信号,用户输入 Ctrl + C 就是发送的此信号,通常用于快速终止进程。
系统默认处理方式:进程快速被终止进程。默认处理程序测试:
SIGQUIT 3 :Quit 退出信号,并生成核心转储文件(coredump文件),可由用户输入 Ctrl + \ 发送此信号。
系统默认处理方式:进程退出,生成 coredump 文件。默认处理程序测试:
SIGILL 4 :Illegal Instruction 非法指令信号。这里的指令指的是CPU指令,操作系统内核在检测到进程尝试执行非法指令时自动发起。
系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:
通常在编译、运行二进制或者硬件故障的情况下会发生。在调试代码的时候,内存溢出的情况下经常会出现此信号,数据被覆盖,尤其是代码段被覆盖,导致指令错乱。
SIGTRAP 5 :Trace/Breakpoint Trap 断点信号。通常用于调试。
系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:
SIGABRT 6 :Abort 进程异常终止信号,由abort(3)函数调用触发。
系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:
SIGBUS 7 :Bus 总线错误,通常指非法内存地址访问。
系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:
SIGFPE 8 :Floating Point Exception 浮点运算错误,通常指除以0错误。
系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:
SIGKILL 9 :Kill 强制终止进程。
系统默认处理方式:终止进程。默认处理程序测试:
这个信号不能被捕获、阻塞或忽略,用于立即结束进程。它是当其他信号无法使进程退出时的最后手段。
SIGUSR1 10 :User Defined Signal 1 用户自定义信号1。
系统默认处理方式:终止进程。默认处理程序测试:
一般用来被重写信号处理函数。
SIGSEGV 11 :Segmentation Violation 断错误信号。发生了非法内存地址访问时,会收到此信号。
系统默认处理方式:终止进程并创建核心转储文件。默认处理程序测试:
内存溢出、double free、访问地址越界等都会报此错误。
SIGUSR2 12 :User Defined Signal 2 用户自定义信号2。
系统默认处理方式:终止进程。默认处理程序测试:
一般用来被重写信号处理函数。
SIGPIPE 13 :Broken Pipe 管道写入错误信号。通常表示向已关闭的管道写入数据。
系统默认处理方式:终止进程。默认处理程序测试:
SIGALRM 14 :Alarm Clock 定时器到期信号,通常由 alarm 函数设置。
系统默认处理方式:终止进程。默认处理程序测试:
SIGTERM 15 :Terminate 请求终止进程信号,通常用于优雅地关闭进程。
系统默认处理方式:终止进程。默认处理程序测试:
一般会重写此信号的处理函数,做一些必要的资源回收和关闭。systemctl stop xxxx.service 默认就是发送的 SIGTERM 信号。此信号 和 SIGINT 几乎一样的功能。
SIGSTKFLT 16 :Stack Fault 栈故障信号。它主要用于旧的 SPARC 架构上的浮点栈溢出。
系统默认处理方式:终止进程。默认处理程序测试:
SIGCHLD 17 :Child Process Stopped or Terminated 子进程状态改变信号。当子进程停止或终止时发送给父进程
系统默认处理方式:忽略。默认处理程序测试:
如果需要处理子进程的返回信息,需要对此信号添加信号处理函数。
SIGCONT 18 :Continue 恢复进程信号。当进程被暂停的时候,通过此信号继续让进程执行。
系统默认处理方式:继续执行进程。默认处理程序测试:
单独触发此信号是没有意义的,当进程被 SIGSTOP 、SIGTSTP 、SIGTTIN 、SIGTTOU 暂停或者由于其他原因暂停的时候,收到此信号,就会继续执行。
SIGSTOP 19 :Stop 暂停进程信号。暂停进程,不能被阻塞、捕获或忽略。进程可以被 SIGCONT 再次启动。
系统默认处理方式:暂停进程。默认处理程序测试:
SIGTSTP 20 :Terminal Stop 暂停进程信号。暂停进程,可以被捕获或忽略。进程可以被 SIGCONT 再次启动。
系统默认处理方式:暂停进程。默认处理程序测试:
SIGTTIN 21 :Background Read from TTY 终端输入信号。暂停进程,收到此信号代表后台试图读取控制终端提供的数据。进程可以被 SIGCONT 再次启动。
系统默认处理方式:暂停进程。默认处理程序测试:
SIGTTOU 22 :Background Write from TTY 终端输出信号。暂停进程,收到此信号代表后台试图把数据写入控制终端。进程可以被 SIGCONT 再次启动。
系统默认处理方式:暂停进程。默认处理程序测试:
SIGURG 23 :Urgent Condition on Socket 紧急数据可用信号。接收到此信号说明套接字上有紧急条件需要处理。
系统默认处理方式:忽略。默认处理程序测试:
信号用于通知进程其套接字上有紧急数据到达。默认情况下,进程会忽略这个信号,但可以通过安装信号处理函数来捕获并处理紧急数据。这对于需要实时响应的通信场景非常有用。通过管理 SIGURG
信号,可以提高应用程序的实时性和响应能力。
SIGXCPU 24 :Exceeded CPU Time Limit CPU使用超时信号。在进程超过为其分配的CPU时间限制时会接收到来自系统的发送的这个信号。
系统默认处理方式:终止进程并创建核心转储。默认处理程序测试:
在执行 ulimit -t 可以查看系统设置的CPU限制,一般默认都是不限制的。或者通过 struct rlimit 设置进程占用CPU时间,一旦超过 CPU 时间限制,就会触发此信号。
SIGXFSZ 25 :Exceeded File Size Limit 超过文件大小限制信号。在进程超过文件大小限制时会接收到来自系统的发送的这个信号。
系统默认处理方式:终止进程并创建核心转储。默认处理程序测试:
在执行 ulimit -f 可以查看系统设置的文件大小限制,一般默认都是不限制的。或者通过 struct rlimit 设置进程打开文件限制,一旦超过限制,就会触发此信号。
SIGVTALRM 26 :Virtual Timer Expired 虚拟定时器到期信号。
系统默认处理方式:终止进程。默认处理程序测试:
虚拟定时器是一种基于进程的用户态时间的定时器,与实际的系统时间无关,只计算进程在用户态下实际运行的时间。
SIGPROF 27 :Profiling Timer Expired 性能分析定时器到期。
系统默认处理方式:终止进程。默认处理程序测试:
记录程序在不同部分的执行时间,帮助识别瓶颈和优化代码。可以通过 setitimer
系统调用来设置性能分析定时器。setitimer
可以设置三种类型的定时器,其中包括性能分析定时器(ITIMER_PROF
)。
SIGWINCH 28 :Window Change 窗口大小改变信号。在终端窗口大小发生变化时发送给进程。
系统默认处理方式:忽略。默认处理程序测试:
通过理解和管理 SIGWINCH
信号,可以提高应用程序的用户体验和适应性。
SIGIO 29 :Input/Output Possible I/O可操作信号。通知进程某个文件描述符已经准备好进行 I/O 操作,通常用于异步 I/O 操作。
系统默认处理方式:终止进程。默认处理程序测试:
SIGPWR 30 :Power Failure 电源故障或即将关机信号。通知进程电源即将断开,通常是由于系统检测到电源故障或即将关机而发送的。
系统默认处理方式:终止进程。默认处理程序测试:
通过设置此信号的处理函数,可以在一定程度上防止突然断电带来的系统损坏。
SIGSYS 31 :Bad System Call 无效系统调用信号。
系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:
SIGRTMIN — SIGRTMAX >=34 & <=64:Real Time min — max 实时信号。
系统默认处理方式:终止进程。默认处理程序测试,以 SIGRTMIN 为例: