信号不仅可以在用户空间内传递,还能跨越用户空间和内核空间,实现进程与内核之间的通信
了解和掌握Linux信号列表及其处理机制,对于深入理解进程控制、系统编程以及调试和维护系统稳定性至关重要
一、Linux信号概述 Linux信号机制源自UNIX,是一种异步通知机制
当某个事件发生时,内核会向相关进程发送一个信号
进程可以选择忽略该信号、执行默认操作或捕获该信号并执行自定义的处理函数
信号的这种特性使得它在进程管理、任务调度、资源控制等方面发挥着重要作用
二、Linux信号列表 在Linux系统中,信号分为两大类:传统UNIX支持的信号和后来扩充的实时信号
传统UNIX信号编号从1到31,是不可靠信号(非实时信号);实时信号编号从34(SIGRTMIN)到63(SIGRTMAX-1),是可靠信号
以下是Linux信号列表的详细解释: 1.SIGHUP(1):当控制终端挂起或控制进程终止时,发送此信号给所有与该终端关联的进程
默认操作为终止进程
2.SIGINT(2):用户键入中断字符(通常是Ctrl-C)时,发送此信号给前台进程组
默认操作为终止进程
3.SIGQUIT(3):用户键入退出字符(通常是Ctrl-)时,发送此信号给前台进程组
默认操作为终止进程并生成core文件
4.SIGILL(4):执行非法指令时发送此信号
通常是因为可执行文件本身出现错误或试图执行数据段
默认操作为终止进程并生成core文件
5.SIGTRAP(5):由断点指令或其它trap指令产生,通常由调试器使用
默认操作为终止进程并生成core文件
6.SIGABRT(6):调用abort函数时发送此信号
默认操作为终止进程并生成core文件
7.SIGBUS(7/10):非法地址访问(如内存地址对齐错误)时发送此信号
默认操作为终止进程并生成core文件
8.SIGFPE(8):发生致命的算术运算错误时发送此信号(如浮点运算错误、溢出及除数为0等)
默认操作为终止进程并生成core文件
9.SIGKILL(9):立即结束程序的运行
此信号不能被阻塞、处理和忽略
10. SIGUSR1(10):用户定义的信号1
可以用于进程间自定义通信
11. SIGSEGV(11):试图访问未分配给自己的内存或试图往没有写权限的内存地址写数据时发送此信号
默认操作为终止进程并生成core文件
12. SIGUSR2(12):用户定义的信号2
同样可以用于进程间自定义通信
13. SIGPIPE(13):在进程间通信时,如采用FIFO(管道)通信的两个进程,若读管道没打开或意外终止,写进程会收到此信号
默认操作为终止进程
14. SIGALRM(14):时钟定时信号,由alarm函数设置
当定时器超时时发送此信号
默认操作为终止进程
15. SIGTERM(15):请求程序正常退出
此信号可以被阻塞和处理
通常用于要求程序自己正常退出
16. SIGSTKFLT(已废弃):协处理器栈错误信号,现已不再使用
17. SIGCHLD(17/20):子进程结束时,父进程会收到此信号
默认操作为忽略
18. SIGCONT(18/19/25):让一个停止(stopped)的进程继续执行
此信号不能被阻塞
19. SIGSTOP(19/17/23):停止(stopped)进程的执行
此信号不能被阻塞、处理和忽略
20. SIGTSTP(20/18/24):停止进程的运行,但此信号可以被处理和忽略
用户键入暂停字符(通常是Ctrl-Z)时发送此信号
21. SIGTTIN(21/21/26):当后台作业要从用户终端读数据时,该作业中的所有进程会收到此信号
默认操作为停止进程
22. SIGTTOU(22/22/27):类似于SIGTTIN,但在写终端(或修改终端模式)时收到
默认操作为停止进程
23. SIGURG(23/16/21):有“紧急”数据或out-of-band数据到达socket时产生
默认操作为忽略
24. SIGXCPU(24/24/30):超过CPU时间资源限制时发送此信号
默认操作为终止进程并生成core文件
25. SIGXFSZ(25/25/31):当进程企图扩大文件以至于超过文件大小资源限制时发送此信号
默认操作为终止进程并生成core文件
26. SIGVTALRM(26/26/28):虚拟时钟信号,类似于SIGALRM,但计算的是该进程占用的CPU时间
默认操作为终止进程
27. SIGPROF(27/27/29):类似于SIGALRM/SIGVTALRM,但包括该进程用的CPU时间以及系统调用的时间
默认操作为终止进程
28. SIGWINCH(28):窗口大小改变时发出
默认操作为忽略
29. SIGIO(29/SIGPOLL):文件描述符准备就绪,可以开始进行输入/输出操作
默认操作为忽略
30. SIGPWR(30):非法系统调用或电源故障时发送此信号
默认操作为忽略
31. SIGSYS(12/-/-):向系统调用传递非法参数时发送此信号
默认操作为终止进程并生成core文件
34-63(SIGRTMIN-SIGRTMAX-1):实时信号,用于用户定义的实时事件通知
这些信号是可靠的,支持排队,不会丢失
三、信号处理机制 在Linux中,信号处理机制主要通过signal系统调用和trap命令实现
1.signal系统调用:用于设置某个信号的处理方法
可以指定为忽略信号、执行默认操作或捕获信号并执行自定义处理函数
2.trap命令:在shell脚本中使用,用于捕获并处理信号
通过指定信号和相应的处理命令,可以在信号发生时执行特定的操作
四、信号的重要性与应用 信号机制在Linux系统中发挥着至关重要的作用
它不仅用于进程间的异步通知,还用于实现进程控制、任务调度和资源管理等功能
例如,通过发送SIGKILL信号可以强制终止无法响应的进程;通过发送SIGTERM信号可以请求程序正常退出;通过捕获和处理SIGCHLD信号可以获取子进程的退出状态等
此外,信号机制在调试和维护系统稳定性方面也具有重要意义
通过捕获和处理异常信号(如SIGSEGV、SIGFPE等),可以及时发现和处理程序中的错误和异常,提高系统的可靠性和稳定性
五、总结 Linux信号列表及其处理机制是进程通信和控制的核心机制之一
了解和掌握这些信号及其处理机制对于深入理解Linux系统的工作原理、提高编程效率和调试能力具有重要意义
通过合理设置信号处理方法、捕获和处理异常信号以及利用实时信号进行进程间通信和资源管理,可以更有效地控制系统的行为和性能,提高系统的可靠性和稳定性