【python】signal信號(hào)處理
1、模塊功能
signal包負(fù)責(zé)在python程序內(nèi)部處理信號(hào),典型的操作包括預(yù)設(shè)信號(hào)處理函數(shù),暫停并等待信號(hào),以及定時(shí)發(fā)出SIGALRM等。
windows和Linux都可以使用signal庫,但是部分信號(hào)只支持Linux,比如signal.SIGALRM。所以使用signal庫時(shí)要注意平臺(tái)。詳情可以參考文檔:https://docs.python.org/3/library/signal.html
信號(hào)是一種進(jìn)程之間通訊的方式,是一種軟件中斷。一個(gè)進(jìn)程一旦接收到信號(hào)就會(huì)打斷原來的程序執(zhí)行流程來處理信號(hào)。
2、模塊安裝
python自帶,沒有特意安裝
3、模塊使用
3.1 預(yù)設(shè)信號(hào)處理函數(shù)
上述代碼含義:當(dāng)接收到停止終端信號(hào)(signal.SIGTSTP),調(diào)用處理函數(shù)handler,輸出信號(hào)值和進(jìn)程棧信息。

由結(jié)果可知,接收到的信號(hào)值為20(可以參考文章《linux - signal信號(hào)》查閱信號(hào)名和信號(hào)值對(duì)應(yīng)情況),frame值為:?<frame at 0xb670fc30, file '1.py', line 12, code <module>>
解釋:
signal.signal(signalnum, handler)函數(shù)有兩個(gè)參數(shù):
signalnum: 某個(gè)信號(hào),比如signal.SIGTSTP
handler: 信號(hào)處理函數(shù)。
signal調(diào)用hander的時(shí)候,會(huì)傳遞兩個(gè)參數(shù):
signum: 這個(gè)就是信號(hào)值,也就是signalnum
frame: 這個(gè)參數(shù)是用來獲得信號(hào)發(fā)生時(shí),進(jìn)程棧的情況。
3.2 定時(shí)發(fā)出信號(hào)
使用的函數(shù)是:signal.alarm()
該函數(shù)被用于在一定時(shí)間之后,向進(jìn)程自身發(fā)送SIGALRM信號(hào)。
代碼示例:
上述代碼含義:程序運(yùn)行5秒后向自身發(fā)送SIGALRM信號(hào),調(diào)用handler函數(shù)。主程序運(yùn)行10秒之后打印信息。為了證明signal.alarm(5)確實(shí)生效了,特意添加了一些打印時(shí)間的信息。運(yùn)行結(jié)果如下:

由上圖輸出結(jié)果可知:
11:32:37,程序開始運(yùn)行
11:32:42,handler函數(shù)被調(diào)用起來了,時(shí)間經(jīng)過了11:32:42 - 11:32:37 = 5秒。說明signal.alarm(5)生效了。
11:32:47,從程序運(yùn)行,到現(xiàn)在共10秒,接著輸出主函數(shù)后面的內(nèi)容。
程序總共耗時(shí)10秒鐘,由此也可以推斷出,signal.alarm()函數(shù)不是阻塞式的。
以上程序是在linux上運(yùn)行的,如果換到windows上運(yùn)行會(huì)報(bào)錯(cuò):
AttributeError: module 'signal' has no attribute 'SIGALRM',原因請參考4.1.

4、遇到的問題
4.1 在windows上運(yùn)行程序報(bào)錯(cuò):AttributeError: module 'signal' has no attribute 'SIGALRM'
原因:部分信號(hào)不支持windows,根據(jù)官方文檔,windows可使用的信號(hào)有:SIGABRT、SIGFPE、SIGILL、SIGINT、SIGSEGV、SIGTERM or SIGBREAK.
https://docs.python.org/3/library/signal.html?highlight=signal#module-signal

4.2 待續(xù)...
5、參考資料
5.1?https://www.cnblogs.com/madsnotes/articles/5688681.html
5.2?https://docs.python.org/3/library/signal.html