
信号提供了一种异步事件处理方式,使得进程可以在事件发生时执行预定义的处理函数(信号处理程序),或采取默认动作
作为系统管理员和开发者,深入理解Linux信号列表及其用法,对于编写健壮和灵活的程序至关重要
信号的基本概念 信号类似于中断,当它在用户级别生成时,会调用操作系统的内核,然后按照相应的方式进行操作
信号可以分为两大类:可屏蔽信号和不可屏蔽信号
可屏蔽信号是用户可以更改或忽略的信号,例如Ctrl+C触发的SIGINT信号
而不可屏蔽信号则是用户无法更改或忽略的信号,这些信号通常在用户被发出非可恢复的硬件错误的信号时发生,例如SIGKILL和SIGSTOP
Linux中的普通信号 Linux中的普通信号共有31个,每个信号都有特定的用途
以下是这些信号的详细列表及其描述: 1.SIGHUP(1):挂起信号,通常在终端断开或关闭时发送给控制进程
这个信号的默认操作为终止进程,但进程可以捕获并忽略它
例如,wget能捕获SIGHUP信号并忽略它,以便在退出Linux登录后继续下载
2.SIGINT(2):中断信号,通常由用户按下Ctrl+C键发送
这个信号用于通知前台进程组终止进程
进程可以捕获这个信号并执行特定的清理操作
3.SIGQUIT(3):退出信号,通常由用户按下Ctrl+键发送并生成核心转储
这个信号与SIGINT类似,但进程在收到SIGQUIT信号退出时会产生core文件,类似于一个程序错误信号
4.SIGILL(4):非法指令,程序执行了非法或未定义的机器语言指令
这个信号通常由可执行文件本身出现错误或试图执行数据段时触发
5.SIGTRAP(5):跟踪/断点陷阱,用于调试
这个信号由断点指令或其他trap指令产生,通常由debugger使用
6.SIGABRT(6):异常终止,由abort()函数调用发送
这个信号通常用于程序内部错误处理,通知进程异常终止
7.SIGBUS(7):总线错误,内存访问对齐错误
这个信号在访问非法地址时触发,例如访问一个四个字长的整数,但其地址不是4的倍数
8.SIGFPE(8):浮点异常,如除零或溢出
这个信号在发生致命的算术运算错误时发出,包括浮点运算错误、溢出及除数为0等
9.SIGKILL(9):强制终止信号,不能被捕获或忽略,立即终止进程
这个信号用于管理员发现某个进程终止不了时,强制结束该进程
10. SIGUSR1(10)和SIGUSR2(12):用户定义信号1和2,应用程序可以自定义使用
这两个信号为用户提供了自定义信号处理的灵活性
11. SIGSEGV(11):段错误,非法内存访问
这个信号在试图访问未分配给自己的内存或试图往没有写权限的内存地址写数据时触发
12. SIGPIPE(13):管道破裂,写入一个没有读取端的管道
这个信号通常在进程间通信时产生,例如采用FIFO(管道)通信的两个进程,如果读管道没有打开或意外终止,写进程会收到SIGPIPE信号
13. SIGALRM(14):闹钟信号,由alarm()函数设置的定时器到期时发送
这个信号用于定时器功能,当定时器到期时通知进程
14. SIGTERM(15):终止信号,程序可以捕获该信号并执行清理操作
这个信号通常用于请求进程正常终止,是shell命令kill的默认信号
15. SIGSTKFLT(16):协处理器堆栈错误(较少使用)
这个信号在协处理器堆栈出错时触发,但现代系统中较少使用
16. SIGCHLD(17):子进程状态改变,当子进程终止或停止时发送给父进程
这个信号用于通知父进程子进程的状态变化
17. SIGCONT(18):继续执行,如果进程已停止则恢复其执行
这个信号用于恢复被停止的进程
18. SIGSTOP(19):停止执行,不能被捕获或忽略
这个信号用于立即停止进程的执行
19. SIGTSTP(20):终端停止信号,通常由用户按下Ctrl+Z键发送
这个信号用于将前台进程组停止执行
20. SIGTTIN(21):后台进程尝试从终端读取时发送
这个信号在后台进程尝试从终端读取数据时触发
21. SIGTTOU(22):后台进程尝试向终端写入时发送
这个信号在后台进程尝试向终端写入数据时触发
22. SIGURG(23):紧急条件,套接字上有紧急数据可读
这个信号用于通知进程套接字上有紧急数据可读
23. SIGXCPU(24):CPU时间限制超时
这个信号在进程超过其CPU时间限制时触发
24. SIGXFSZ(25):文件大小限制超时
这个信号在进程尝试创建或扩展文件超过其文件大小限制时触发
25. SIGVTALRM(26):虚拟定时器到期
这个信号用于虚拟定时器功能,当虚拟定时器到期时通知进程
26. SIGPROF(27):统计定时器到期
这个信号用于统计定时器功能,当统计定时器到期时通知进程
27. SIGWINCH(28):终端窗口大小改变
这个信号用于通知进程终端窗口大小的变化
28. SIGPOLL(29):I/O操作事件(SysV定义)
这个信号用于通知进程I/O操作事件,如数据可读或可写
29. SIGPWR(30):电源故障
这个信号在电源故障时触发,但现代系统中较少使用
30. SIGSYS(31):非法系统调用
这个信号在进程执行非法系统调用时触发
信号的处理方式 进程对信号的处理方式主要有三种:忽略信号、捕获信号和系统默认动作
- 忽略信号:大多数信号都可以被进程忽略,但SIGKILL和SIGSTOP是例外,它们不能被忽略
- 捕获信号:进程可以定义一个信号处理函数,当信号发生时,就会触发调用该自定义信号处理函数
使用signal()或sigaction()函数可以设置信号处理函数
- 系统默认动作:大多数信号的默认动作是终止该进程
有些信号会“终止+core”,即终止进程并生成core文件
信号相关函数 - signal():用于设置信号处理程序
它能够指定当进程接收到特定信号时要执行的处理程序
- sigaction():提供了比signal()更灵活和强大的功能
它可以设置特定的信号处理程序,并且可以在信号处理程序执行时控制阻塞哪些信号
- kill():用于向指定进程或进程组发送信号
它不仅可以用来终止进程,还可以发送其他信号来控制进程的行为
信号的实际应用 信号在编程和系统管理中有着广泛的应用
通过使用信号,进程可以处理各种异常和特殊情况,实现更健壮和灵活的程序设计
例如,可以使用SIGINT信号来捕获用户按下Ctrl+C键的中断操作,执行特定的清理操作后再退出程序
又如,可以使用SIGTERM信号来请求进程正常终止,并在终止前执行必要的清理工作
此外,信号还可以用于实现进程间的同步和通信
例如,父进程可以使用SIGCHLD信号来捕获子进程的状态变化,从而做出相应的处理
结语 Linux信号列表是Linux和Unix系统中进程间通信的重要机制
通过深入理解信号的概念、类型、处理方式和相关函数,我们可以更好地掌握进程间通信的技巧和方法
在实际应用中,合理利用信号可以提高程序的健壮性和灵活性,实现更复杂的系统功能和需求
因此,作为系
Hyper-V网卡故障:排查与解决方案
Linux信号列表全解析:掌握进程通信利器
重磅!全新Linux系统震撼推出
VMware ESXi 6.5高效设置指南:全面优化你的虚拟化环境
VMware缺失SMC:影响与解决方案
Hyper-V网卡聚合:提升性能新技巧
VMware Horizon使用指南精简版
重磅!全新Linux系统震撼推出
Linux INI文件配置全解析
Linux系统下分包解压技巧揭秘
探索Linux中文内核:开启系统新体验
Linux下RAR文件解压全攻略
Linux终端粘贴技巧大揭秘
Linux INS 32025驱动安装指南
Linux免密登录:安全与否深度解析
Linux Info Page:掌握系统详情必备指南
Linux系统下快速安装MySQL客户端指南
Linux下如何解压RAR文件技巧
Linux umask 0:开放权限设置的奥秘