linux開發中,通常會在進程中設置專門的信號處理方法,比如經常使用的CTRL+C,KILL等信號.如果你熟悉liunx編程,那么python等信號處理方法對你來說就很簡單,下面的內容將主要介紹python 中singal包的使用.
一、signal使用實例
import signal, os def handler(signum, frame): print 'Signal handler called with signal', signum raise IOError("Couldn't open device!") # Set the signal handler and a 5-second alarm signal.signal(signal.SIGALRM, handler) signal.alarm(5) # This open() may hang indefinitely fd = os.open('/dev/ttyS0', os.O_RDWR) signal.alarm(0) # Disable the alarm
這段代碼是python官網提供的實例代碼,現在還不明白沒關系,接着向下看.
二、signal定義和使用
signal包中,提供了對信號處理接口和定義的各種信號量.
sihnal.signal(
signalnum,
handler)接口可以向系統注冊處理的信號和要處理的操作,
signalnum為要處理的信號,可以為SIGNNT、SIGNQUIT等信號,hander為捕獲到信號后的處理方法,可以使用signal中的默認處理標志(SIG_DFL)或者忽略(SIG_IGN).也可以自定義操作.實例如下:
#!/usr/bin/python #coding:utf-8 import signal,os def signal_fun(signum,frame): print 'recv signal:%d' % signum if __name__ == '__main__': signal.signal(signal.SIGINT, signal_fun) signal.pause()
signal_fun接口就是接收到信號后自定義的處理方法,signal.pause()調用后,會使進程一直阻塞,直到接收到處理信號,處理完成后退出.
上面的腳本使用python sign.py運行后,會一直阻塞在signal.pause(),當輸入ctrl+c后,腳本會接收到信號,然后打印信號類型,並結束運行,實際的編碼過程中可以在主程序的main函數中預先注冊需要處理的的信號.並使用默認的處理邏輯,滿足實際的需要.使用的場景主要是:
1、設置標志讓進程退出.進程在循環處理任務時不能夠使用kill-9.這樣會破壞進程的正常處理流程,使用kill時要等任務處理完才會退出,有時候等待的時間會比較久,因此,實際使用時,可以在接收信號后,設置進程退出標示,等當前事務處理完,判斷退出標示,然后正常退出進程.
2、忽略某些信號,linux信號處理機制可以幫助我們做很多事情,但是遇到不想處理的信號時需要將其過濾,只處理需要使用的信號
三、定時發送信號
回到第一個問題,看如下案例:

運行腳本,腳本調用signal.alarm(5)5秒后給自身發送一個alarm信號,然后進程被阻塞,5秒后,進程收到自身給自身發送的信號,處理退出.alarm參數為0時,默認失效.
四、總結
signal.SIG* 各種信號表示
signal.signal(signum,frame) 注冊信號
signal.pause() 堵塞信號
signal.alarm() 發送告警信號