python 信號處理


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( signalnumhandler)接口可以向系統注冊處理的信號和要處理的操作,  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() 發送告警信號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM