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