Linux中的31个普通信号
目录
每种信号的含义
关键分类速查
两种不能被忽略的信号
两种不能被捕捉的信号
每种信号的含义
| 编号 | 信号名 | 触发条件 | 典型场景 |
|---|---|---|---|
| 1 | SIGHUP | 终端连接断开 | SSH断开后后台进程终止 |
| 2 | SIGINT | 用户按下Ctrl+C | 中断正在运行的ping命令 |
| 3 | SIGQUIT | 用户按下Ctrl+\ | 强制终止程序并生成core文件(调试用) |
| 4 | SIGILL | 执行非法CPU指令 | 运行损坏的可执行文件 |
| 5 | SIGTRAP | 调试断点触发 | gdb在断点处暂停进程 |
| 6 | SIGABRT | 调用abort()函数 | 内存检测工具发现错误时主动崩溃 |
| 7 | SIGBUS | 内存访问对齐错误 | ARM架构访问非对齐地址 |
| 8 | SIGFPE | 算术异常(如除零) | int x=1/0;导致崩溃 |
| 9 | SIGKILL | 强制终止信号(不可捕获/忽略) | kill -9结束卡死进程 |
| 10 | SIGUSR1 | 用户自定义信号1 | nginx -s reopen重新打开日志文件 |
| 11 | SIGSEGV | 无效内存访问 | 解引用空指针*NULL=1; |
| 12 | SIGUSR2 | 用户自定义信号2 | Redis手动触发RDB持久化 |
| 13 | SIGPIPE | 向已关闭的管道写入数据 | `echo hello(head -n1`(head提前退出后echo收到信号)) |
| 14 | SIGALRM | 定时器超时(alarm()/setitimer()) | sleep()函数底层实现 |
| 15 | SIGTERM | 终止请求(可捕获) | kill命令默认发送的信号 |
| 16 | SIGSTKFLT | 协处理器栈错误(已废弃) | 现代Linux不再使用 |
| 17 | SIGCHLD | 子进程状态变更 | 父进程通过wait()回收僵尸进程 |
| 18 | SIGCONT | 恢复被暂停的进程 | fg命令恢复后台作业 |
| 19 | SIGSTOP | 强制暂停进程(不可捕获/忽略) | Ctrl+Z的底层实现 |
| 20 | SIGTSTP | 用户按下Ctrl+Z | 暂停vim编辑器 |
| 21 | SIGTTIN | 后台进程尝试读取终端 | 后台运行cat命令 |
| 22 | SIGTTOU | 后台进程尝试写入终端 | 后台运行echo hello > /dev/tty |
| 23 | SIGURG | socket紧急数据到达 | TCP带外数据(OOB)通知 |
| 24 | SIGXCPU | 进程CPU时间超过限制 | 超过ulimit -t设置的值 |
| 25 | SIGXFSZ | 文件大小超过限制 | 写入超过ulimit -f限制的文件 |
| 26 | SIGVTALRM | 虚拟定时器(仅统计进程CPU时间)超时 | 性能分析工具采样 |
| 27 | SIGPROF | 性能分析定时器(含系统调用时间)超时 | gprof性能剖析工具 |
| 28 | SIGWINCH | 终端窗口大小改变 | 调整tmux窗格时重绘界面 |
| 29 | SIGIO | 异步I/O事件 | 高并发网络服务器事件通知 |
| 30 | SIGPWR | 电源故障 | UPS触发安全关机流程 |
| 31 | SIGSYS | 无效系统调用 | 调用不存在的系统调用号 |
关键分类速查
| 类别 | 信号示例 | 处理方式 |
|---|---|---|
| 终止信号 | 1, 2, 3, 6, 9, 15 | 默认终止进程 |
| 错误信号 | 4, 7, 8, 11, 31 | 终止+core dump |
| 控制信号 | 17, 18, 19, 20 | 进程状态管理 |
| 定时器信号 | 14, 26, 27 | 超时控制 |
| 用户自定义信号 | 10, 12 | 开发者自定义逻辑 |
注:
-
标有core dump的信号需系统配置支持(
ulimit -c unlimited) -
SIGKILL(9)和SIGSTOP(19)不能被捕获/忽略
-
用户信号(SIGUSR1/2)的具體行为由程序自行定义
-
两种不能被忽略的信号
SIGKILL和SIGSTOP
两种不能被捕捉的信号
SIGKILL和SIGSTOP
