信號 是 Linux 進程間通信 (IPC) 中最古老、最基礎,也是系統管理與編程必須掌握的核心機制。它像系統發給進程的「緊急通知」,雖然攜帶信息量極小(僅一個整數),卻能觸發進程終止、暫停、恢復等關鍵行為。本文從概念模型、生命週期、常見信號、Shell 實戰四個維度,構建完整認知體系。
這種異步通知機制打破了進程隔離,讓內核或其他進程能異步干預目標進程行為。
kill()、raise())向目標進程 PCB 中的信號集合設置標誌位。Pending 狀態,直到進程下次從內核態返回用戶態(系統調用結束、中斷返回、調度點)時檢查。signal()/sigaction())。阻塞:進程可調用 sigprocmask() 將特定信號加入阻塞集,使其持續處於 Pending 狀態,直到解除阻塞。
| 信號 | 值 | 來源/觸發鍵 | 默認動作 | 典型用途 |
|---|---|---|---|---|
| SIGHUP | 1 | 終端掛斷/控制進程退出 | Term | 通知守護進程重讀配置 |
| SIGINT | 2 | Ctrl+C | Term | 終止前台作業 |
| SIGQUIT | 3 | Ctrl+\ | Core | 強制退出並生成核心轉儲 |
| SIGKILL | 9 | kill -9 | Term | 不可捕獲/忽略/阻塞,強制殺進程 |
| SIGTERM | 15 | kill (默認) | Term | 優雅關閉,可捕獲做清理 |
| SIGSTOP | 19 | Ctrl+Z (內核) | Stop | 不可捕獲,暫停進程 |
| SIGTSTP | 20 | Ctrl+Z (Shell) | Stop | 可捕獲,交互式暫停 |
| SIGCONT | 18 | fg/bg/kill -CONT | Cont | 恢復暫停進程 |
| SIGCHLD | 17 | 子進程結束 | Ignore | 父進程回收僵屍進程 |
| SIGALRM | 14 | alarm()/setitimer() | Term | 定時器超時通知 |
| SIGPIPE | 13 | 寫無讀端管道 | Term | 管道/網絡連接斷開 |
查看完整列表:man 7 signal 或 kill -l。
$ ping localhost
# 按 Ctrl+Z 發送 SIGTSTP
[1]+ Stopped ping localhost
$ ps -o pid,stat,cmd -C ping
PID STAT CMD
27397 T ping localhost # T 表示 Stopped (traced or stopped)
$ kill -SIGCONT 27397 # 或 fg %1 / bg %1
$ ping localhost # 繼續運行
kill 命令發送任意信號kill -l # 列出所有信號名/編號
kill -SIGTERM 1234 # 按名稱發送
kill -15 1234 # 按編號發送
kill -9 1234 # 強制殺死 (SIGKILL)
kill -0 1234 # 僅檢測進程是否存在/可發信號
#!/bin/bash
# trap_demo.sh
cleanup() {
echo "捕獲信號,執行清理..."
rm -f /tmp/temp_$$
exit 0
}
trap cleanup SIGINT SIGTERM SIGHUP
echo "PID: $$,運行中... 按 Ctrl+C 測試"
while true; do sleep 1; done
信號機制四大狀態:Generate → Pending → Deliver → Handle;三大處置:Ignore / Default / Catch。掌握 kill、trap、Ctrl+C/Z/\ 實戰操作,理解 SIGKILL/SIGSTOP 不可捕獲特性,是 Linux 系統管理與後端開發的必修課。
