簡單說明
python signal 模塊是對系統進程信號的實現。在進程運行過程中,進程會後臺監聽信號事件,執行相應的處理函數。例如ctrl+c
鍵盤中斷事件,kill -9
強制殺死進程命令,都是向進程發送相應的信號。每個信號有一個編號和名稱。其作用是一樣的,在標準庫中作爲常量定義。
簡單使用
import signal
def handler(signum, frame):
# do something
pass
signal.signal(signal.SIGINT, handler)
# 通過信號名稱獲取對應註冊的函數
func = signal.getsignal(signal.SIGTERM)
# 向自身發送SIGARARM信號,避免持續阻塞
signal.alarm(5)
# 暫停進程以等待信號
signal.pause()
註冊函數
信號事件處理函數接受兩個參數:信號編號和當前的棧幀(stack frame)或None。棧幀的定義和使用詳見 https://docs.python.org/3/reference/datamodel.html#frame-objects 。簡單的理解,棧幀就是異常打印出來的那堆東西,當執行事件處理函數時,需要知道進程執行到哪一步,所以需要棧幀來判斷進程的執行狀態。
常用信號
信號 | 名稱 | 作用 |
---|---|---|
1 | SIGHUP | 終端掛起或者終止進程。默認動作爲終止進程 |
2 | SIGINT | 鍵盤中斷 <ctrl+c> 經常會用到。默認動作爲終止進程 |
3 | SIGQUIT | 鍵盤退出鍵被按下。一般用來響應 <ctrl+d>。 默認動作終止進程 |
9 | SIGKILL | 強制退出。 shell中經常使用 |
14 | SIGALRM | 定時器超時,默認爲終止進程 |
15 | SIGTERM | 程序結束信號,程序一般會清理完狀態在退出,我們一般說的優雅的退出 |
備註
需要注意的並非所有信號都可以自定義處理函數或忽略。比較特殊的一點就是強制退出 SIGKILL,因爲如果能被重新的定義的話,可能就沒辦法殺掉進程了。