Linux 信号(Signal)是操作系统内核或进程间通信的一种基本机制,主要用于通知进程发生了某种事件。它允许进程或内核中断进程的正常执行流程,强制其处理异步事件。以下是信号的典型用途和分类:
进程控制
SIGTERM
(优雅终止)、SIGKILL
(强制终止)。SIGSTOP
(强制暂停)、SIGCONT
(恢复执行)。SIGINT
(终端中断,如 Ctrl+C
)。异常处理
SIGSEGV
(段错误)、SIGFPE
(除零错误)。SIGTRAP
(调试断点)。进程间通信(IPC)
kill()
向另一个进程发送信号(如 SIGUSR1
自定义用途)。系统事件通知
SIGCHLD
(通知父进程回收子进程资源)。SIGHUP
(如 SSH 断开时通知守护进程)。信号名 | 值 | 默认行为 | 触发场景 |
---|---|---|---|
SIGINT |
2 | 终止进程 | 用户按下 Ctrl+C |
SIGTERM |
15 | 终止进程 | kill 默认发送的信号 |
SIGKILL |
9 | 强制终止 | 不可捕获或忽略 |
SIGSTOP |
19 | 暂停进程 | 不可捕获或忽略 |
SIGCONT |
18 | 恢复执行 | 恢复被暂停的进程 |
SIGSEGV |
11 | 终止+核心转储 | 非法内存访问 |
SIGPIPE |
13 | 终止进程 | 管道写入端关闭(如 | head ) |
SIGUSR1/2 |
10/12 | 无默认行为 | 用户自定义用途 |
signal()
或 sigaction()
注册信号处理函数。c
#include <signal.h>
void handler(int sig) { /* 自定义逻辑 */ }
signal(SIGINT, handler); // 捕获 SIGINT
signal(SIGXXX, SIG_IGN)
忽略信号(SIGKILL
和 SIGSTOP
除外)。sigprocmask()
临时屏蔽信号,延迟处理。SIGTERM
通知服务清理资源后退出。SIGHUP
重新加载配置文件。SIGCHLD
回收子进程,避免僵尸进程。SIGTRAP
触发调试器断点。SIGKILL
和 SIGSTOP
不能被捕获、忽略或阻塞。printf
)。# 发送 SIGTERM 终止进程(PID=1234)
kill 1234
# 强制杀死进程
kill -9 1234
# 列出所有信号
kill -l
通过理解信号机制,可以更高效地控制进程行为并处理异常事件。