| 信號 | 說明 |
|---|---|
| SIG_DFL | |
| SIG_IGN | 標準信號處理程序,它將簡單地忽略給定的信號 |
| SIGABRT SIGIOT | 來自 abort 的中止信號。 abort 導致異常進程終止。通常由檢測內(nèi)部錯誤或嚴重破壞約束的庫函數(shù)調(diào)用。例如,如果堆的內(nèi)部結(jié)構(gòu)被堆溢出損壞, malloc() 將調(diào)用 abort() |
| SIGALRM SIGVTALRM SIGPROF |
如果你用 setitimer 這一類的報警設置函數(shù)設置了一個時限,到達時限時進程會接收到 SIGALRM, SIGVTALRM 或者 SIGPROF。但是這三個信號量的含義各有不同,SIGALRM 計時的是真實時間,SIGVTALRM計時的是進程使用了多少CPU時間,而 SIGPROF 計時的是進程和代表該進程的內(nèi)核用了多少時間。 |
| SIGBUS | 總線發(fā)生錯誤時,進程接收到一個SIGBUS信號。舉例來說,存儲器訪問對齊或者或不存在對應的物理地址都會產(chǎn)生SIGBUS信號。 |
| SIGCHLD | 當子進程終止、被中斷或被中斷后恢復時,SIGCHLD信號被發(fā)送到進程。該信號的一個常見用法是指示操作系統(tǒng)在子進程終止后清理其使用的資源,而不顯式調(diào)用等待系統(tǒng)調(diào)用。 |
| SIGILL | 非法指令。當進程試圖執(zhí)行非法、格式錯誤、未知或特權(quán)指令時,SIGILL信號被發(fā)送到該進程。 |
| SIGKILL | 發(fā)送SIGKILL信號到一個進程可以使其立即終止(KILL)。與SIGTERM和SIGINT相不同的是,這個信號不能被捕獲或忽略,接收過程在接收到這個信號時不能執(zhí)行任何清理。 以下例外情況適用: |
| SIGINT | 來自鍵盤的中斷 (CTRL + C)。 KeyboardInterrupt |
| SIGPIPE | 當一個進程試圖寫入一個沒有連接到另一端進程的管道時,SIGPIPE信號會被發(fā)送到該進程。 |
| **SIGTERM ** | 終結(jié)信號。 KILL -15 |KILL |
| SIGUSR1 SIGUSR2 |
用戶自定義信號 |
| SIGWINCH | 終端窗口大小已變化 |
| SIGHUP | 在控制終端上檢測到掛起或控制進程的終止。 |
Reference:[signal-wikipedia](
Python的信號庫中也有很多常用的函數(shù)
創(chuàng)建一個 SIGALRM 類型的信號,time為預定的時間,設置為0時取消先前設置的定時器
可以使代碼邏輯處理過程睡眠,直到收到信號,然后調(diào)用對應的handler。
import signal
import os
import time
def do_exit(sig, stack):
raise SystemExit('Exiting')
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGUSR1, do_exit)
print('My PID:', os.getpid())
signal.pause()
在執(zhí)行時,忽略了ctrl + c的信號,對USR1做退出操作
which: signal.ITIMER_REAL,signal.ITIMER_VIRTUAL 或 signal.ITIMER_PROF
seconds:多少秒后觸發(fā)which。seconds設置為0可以清除which的計時器。
interval:每隔interval秒后觸發(fā)一次
獲得當前執(zhí)行程序的pid
在Linux中,可以通過任何可接受的信號枚舉值作為信號函數(shù)的參數(shù)。在Windows中,SIGABRT, SIGFPE, SIGINT, SIGILL, SIGSEGV, SIGTERM, SIGBREAK。
在一些時候,signal handling的操作需要對應主進程傳遞進來一些函數(shù),而在整個項目中執(zhí)行過程中的變量與 signal handling不處于一個作用域中,而signal.signal() 不能傳遞其他的參數(shù),這個時候可以使用 partial 創(chuàng)建一個閉包來解決這個問題。
例如:
import signal
import os
import sys
import time
from functools import partial
"""
這里signal frame默認參數(shù)需要放到最后
"""
def signal_handler(test_parameter1, test_parameter2, signal_num, frame):
print "signal {} exit. {} {}".format(signal_num, test_parameter1, test_parameter2)
sys.exit(1)
a=1
b=2
signal.signal(signal.SIGINT, partial(signal_handler, a, b) )
print('My PID:', os.getpid())
signal.pause()
signal定義了忽略接收信號的方法。為了實現(xiàn)信號的處理,需要使用signal.signal() 將默認的信號與signal.SIG_IGN 注冊,即可忽略對應的信號中斷,kill -9 不可忽略 。
import signal
import os
import time
def receiveSignal(signalNumber, frame):
print('Received:', signalNumber)
raise SystemExit('Exiting')
return
if __name__ == '__main__':
# register the signal to be caught
signal.signal(signal.SIGUSR1, receiveSignal)
# register the signal to be ignored
signal.signal(signal.SIGINT, signal.SIG_IGN)
# output current process id
print('My PID is:', os.getpid())
signal.pause()
import signal
import os
import time
import sys
def readConfiguration(signalNumber, frame):
print ('(SIGHUP) reading configuration')
return
def terminateProcess(signalNumber, frame):
print ('(SIGTERM) terminating the process')
sys.exit()
def receiveSignal(signalNumber, frame):
print('Received:', signalNumber)
return
signal.signal(signal.SIGHUP, readConfiguration)
signal.signal(signal.SIGINT, receiveSignal)
signal.signal(signal.SIGQUIT, receiveSignal)
signal.signal(signal.SIGILL, receiveSignal)
signal.signal(signal.SIGTRAP, receiveSignal)
signal.signal(signal.SIGABRT, receiveSignal)
signal.signal(signal.SIGBUS, receiveSignal)
signal.signal(signal.SIGFPE, receiveSignal)
#signal.signal(signal.SIGKILL, receiveSignal)
signal.signal(signal.SIGUSR1, receiveSignal)
signal.signal(signal.SIGSEGV, receiveSignal)
signal.signal(signal.SIGUSR2, receiveSignal)
signal.signal(signal.SIGPIPE, receiveSignal)
signal.signal(signal.SIGALRM, receiveSignal)
signal.signal(signal.SIGTERM, terminateProcess)
到此這篇關于python中對信號處理的文章就介紹到這了,更多相關python信號處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!