python signal筆記

簡單說明

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,因爲如果能被重新的定義的話,可能就沒辦法殺掉進程了。

引用

https://juejin.im/post/5c0a4a92f265da61682b2f65

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章