信號(hào) | 說明 |
---|---|
SIG_DFL | |
SIG_IGN | 標(biāo)準(zhǔn)信號(hào)處理程序,它將簡(jiǎn)單地忽略給定的信號(hào) |
SIGABRT SIGIOT | 來自 abort 的中止信號(hào)。 abort 導(dǎo)致異常進(jìn)程終止。通常由檢測(cè)內(nèi)部錯(cuò)誤或嚴(yán)重破壞約束的庫函數(shù)調(diào)用。例如,如果堆的內(nèi)部結(jié)構(gòu)被堆溢出損壞, malloc() 將調(diào)用 abort() |
SIGALRM SIGVTALRM SIGPROF |
如果你用 setitimer 這一類的報(bào)警設(shè)置函數(shù)設(shè)置了一個(gè)時(shí)限,到達(dá)時(shí)限時(shí)進(jìn)程會(huì)接收到 SIGALRM, SIGVTALRM 或者 SIGPROF。但是這三個(gè)信號(hào)量的含義各有不同,SIGALRM 計(jì)時(shí)的是真實(shí)時(shí)間,SIGVTALRM計(jì)時(shí)的是進(jìn)程使用了多少CPU時(shí)間,而 SIGPROF 計(jì)時(shí)的是進(jìn)程和代表該進(jìn)程的內(nèi)核用了多少時(shí)間。 |
SIGBUS | 總線發(fā)生錯(cuò)誤時(shí),進(jìn)程接收到一個(gè)SIGBUS信號(hào)。舉例來說,存儲(chǔ)器訪問對(duì)齊或者或不存在對(duì)應(yīng)的物理地址都會(huì)產(chǎn)生SIGBUS信號(hào)。 |
SIGCHLD | 當(dāng)子進(jìn)程終止、被中斷或被中斷后恢復(fù)時(shí),SIGCHLD信號(hào)被發(fā)送到進(jìn)程。該信號(hào)的一個(gè)常見用法是指示操作系統(tǒng)在子進(jìn)程終止后清理其使用的資源,而不顯式調(diào)用等待系統(tǒng)調(diào)用。 |
SIGILL | 非法指令。當(dāng)進(jìn)程試圖執(zhí)行非法、格式錯(cuò)誤、未知或特權(quán)指令時(shí),SIGILL信號(hào)被發(fā)送到該進(jìn)程。 |
SIGKILL | 發(fā)送SIGKILL信號(hào)到一個(gè)進(jìn)程可以使其立即終止(KILL)。與SIGTERM和SIGINT相不同的是,這個(gè)信號(hào)不能被捕獲或忽略,接收過程在接收到這個(gè)信號(hào)時(shí)不能執(zhí)行任何清理。 以下例外情況適用: |
SIGINT | 來自鍵盤的中斷 (CTRL + C)。 KeyboardInterrupt |
SIGPIPE | 當(dāng)一個(gè)進(jìn)程試圖寫入一個(gè)沒有連接到另一端進(jìn)程的管道時(shí),SIGPIPE信號(hào)會(huì)被發(fā)送到該進(jìn)程。 |
**SIGTERM ** | 終結(jié)信號(hào)。 KILL -15 |KILL |
SIGUSR1 SIGUSR2 |
用戶自定義信號(hào) |
SIGWINCH | 終端窗口大小已變化 |
SIGHUP | 在控制終端上檢測(cè)到掛起或控制進(jìn)程的終止。 |
Reference:[signal-wikipedia](
Python的信號(hào)庫中也有很多常用的函數(shù)
創(chuàng)建一個(gè) SIGALRM 類型的信號(hào),time為預(yù)定的時(shí)間,設(shè)置為0時(shí)取消先前設(shè)置的定時(shí)器
可以使代碼邏輯處理過程睡眠,直到收到信號(hào),然后調(diào)用對(duì)應(yīng)的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í)行時(shí),忽略了ctrl + c的信號(hào),對(duì)USR1做退出操作
which: signal.ITIMER_REAL,signal.ITIMER_VIRTUAL 或 signal.ITIMER_PROF
seconds:多少秒后觸發(fā)which。seconds設(shè)置為0可以清除which的計(jì)時(shí)器。
interval:每隔interval秒后觸發(fā)一次
獲得當(dāng)前執(zhí)行程序的pid
在Linux中,可以通過任何可接受的信號(hào)枚舉值作為信號(hào)函數(shù)的參數(shù)。在Windows中,SIGABRT, SIGFPE, SIGINT, SIGILL, SIGSEGV, SIGTERM, SIGBREAK。
在一些時(shí)候,signal handling的操作需要對(duì)應(yīng)主進(jìn)程傳遞進(jìn)來一些函數(shù),而在整個(gè)項(xiàng)目中執(zhí)行過程中的變量與 signal handling不處于一個(gè)作用域中,而signal.signal() 不能傳遞其他的參數(shù),這個(gè)時(shí)候可以使用 partial 創(chuàng)建一個(gè)閉包來解決這個(gè)問題。
例如:
import signal import os import sys import time from functools import partial """ 這里signal frame默認(rèn)參數(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定義了忽略接收信號(hào)的方法。為了實(shí)現(xiàn)信號(hào)的處理,需要使用signal.signal() 將默認(rèn)的信號(hào)與signal.SIG_IGN 注冊(cè),即可忽略對(duì)應(yīng)的信號(hào)中斷,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)
到此這篇關(guān)于python中對(duì)信號(hào)處理的文章就介紹到這了,更多相關(guān)python信號(hào)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:佳木斯 西寧 湖北 宜昌 上饒 潮州 珠海 盤錦
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python中對(duì)信號(hào)的處理詳解》,本文關(guān)鍵詞 python,中,對(duì),信,號(hào)的,處理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。