訊號(signal):訊號是在軟體層次上對中斷機制的一種模擬,通過給乙個程序傳送訊號,執行相應的處理函式。
程序可以通過三種方式來響應乙個訊號:
1)忽略訊號,即對訊號不做任何處理,其中有兩個訊號不能忽略:sigkill及sigstop。
2)捕捉訊號。
3)執行預設操作,linux對每種訊號都規定了預設操作。
linux究竟採用上述三種方式的哪乙個來響應訊號呢?取決於傳遞給響應的api函式。
linux支援的訊號有:
編號
訊號名稱
預設動作
描述
sighup
終止終止程序,掛起
sigint
終止鍵盤輸入中斷命令,一般是ctrl+c
sigquit
coredump
鍵盤輸入退出命令,一般是ctrl+\
sigill
coredump
非法指令
sigtrap
coredump
trap指令發出,一般除錯用
sigabrt
coredump
abort(3)發出的終止訊號
sigbus
coredump
非法位址
sigfpe
coredump
浮點數異常
sigkill
終止立即停止程序,不能捕獲,不能忽略
sigusr1
終止使用者自定義訊號1,像nginx就支援usr1訊號,用於過載配置,重新開啟日誌
sigse**
coredump
無效記憶體引用
sigusr2
終止使用者自定義訊號2
sigpipe
終止管道不能訪問
sigalrm
終止時鐘訊號,alrm(2)發出的終止訊號
sigterm
終止終止訊號,程序會先關閉正在執行的任務或開啟的檔案再終止,有時間程序在有執行的任務而忽略此訊號。不能捕捉
sigstkflt
終止處理器棧錯誤
sigchld
可忽略子程序結束時,父程序收到的訊號
sigcont
可忽略讓終止的程序繼續執行
sigstop
停止停止程序,不能忽略,不能捕獲
sigstp
停止停止程序,一般是ctrl+z
sigttin
停止後台程序從終端讀資料
sigttou
停止後台程序從終端寫資料
sigurg
可忽略緊急陣列是否到達socket
sigxcpu
coredump
超出cpu占用資源限制
sigxfsz
coredump
超出檔案大小資源限制
si**talrm
終止虛擬時鐘訊號,類似於sigalrm,但計算的是程序占用的時間
sigprof
終止類似與sigalrm,但計算的是程序占用cpu的時間
sigwinch
可忽略視窗大小改變發出的訊號
sigio
終止檔案描述符準備就緒,可以輸入/輸出操作了
sigpwr
終止電源失敗
sigsys
coredump
非法系統呼叫
coredump(核心轉儲):當程式執行過程中異常退出時,核心把當前程式在記憶體狀況儲存在乙個core檔案中,以便除錯。
linux支援兩種訊號:
一種是標準訊號,編號1-31,稱為非可靠訊號(非實時),不支援佇列,訊號可能會丟失,比如傳送多次相同的訊號,程序只能收到一次,如果第乙個訊號沒有處理完,第二個訊號將會丟棄。
另一種是擴充套件訊號,編號32-64,稱為可靠訊號(實時),支援佇列,發多少次程序就可以收到多少次。
訊號型別比較多,我們只要了解下,記住幾個常用訊號就行了,紅色標記的我覺得需要記下。
傳送訊號一般有兩種情況:
一種是核心檢測到系統事件,比如鍵盤輸入ctrl+c會傳送sigint訊號。
另一種是通過系統呼叫kill命令來向乙個程序傳送訊號。
kill命令傳送訊號給程序。
命令格式:kill [-s sigspec | -n signum | -sigspec] pid | jobspec ...
kill -l [sigspec]
-s # 訊號名稱
-n # 訊號編號
-l # 列印編號1-31訊號名稱
示例:
trap命令定義shell指令碼在執行時根據接收的訊號做相應的處理。給乙個程序傳送終止訊號:
kill -s sigterm pid
或
kill -n 15 pid
或
kill -15 pid
或
kill -trem pid
命令格式:trap [-lp] [[arg] signal_spec ...]
-l #列印編號1-64編號訊號名稱
arg # 捕獲訊號後執行的命令或者函式
signal_spec # 訊號名或編號
一般捕捉訊號後,做以下幾個動作:
1)清除臨時檔案
2)忽略該訊號
3)詢問使用者是否終止指令碼執行
示例1:按ctrl+c不退出迴圈
示例2:迴圈列印數字,按ctrl+c退出,並列印退出提示#!/bin/bash
trap "" 2 # 不指定arg就不做任何操作,後面也可以寫多個訊號,以空格分隔
for i in ; do
echo $i
sleep 1
done
# bash a.sh
1
2
3
^c4
5
6
^c7
8
9
10
示例3:讓使用者選擇是否終止迴圈#!/bin/bash
trap "echo 'exit...';exit" 2
for i in ; do
echo $i
sleep 1
done
# bash test.sh
1
2
3
^cexit...
#!/bin/bash
trap "func" 2
func()
for i in ; do
echo $i
sleep 1
done
# bash a.sh
1
2
3
^cterminate the process? (y/n): y
# bash a.sh
1
2
3
^cterminate the process? (y/n): n
4
5
6
...
linux訊號 阻塞訊號
1.訊號在核心中的表示 我們知道了訊號產生的各種原因,而實際執行訊號處理的動作,叫做訊號遞達 delivery 訊號從產生到遞達之間的狀態,稱為訊號未決 pending 程序可以選擇阻塞 block 某個訊號。被阻塞的訊號產生時將保持在未決狀態,直到程序解除對此訊號的阻塞,才執行遞達的動作。注意,阻...
Linux程序訊號 訊號處理
一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...
訊號量型別
sighup 終止程序 終端線路結束通話 sigint 終止程序 中斷程序 sigquit 建立core檔案終止程序,並且生成core檔案 sigill 建立core檔案 非法指令 sigtrap 建立core檔案 跟蹤自陷 sigbus 建立core檔案 匯流排錯誤 sigsegv 建立core檔...