Python信號處理模塊signal


Python信號處理模塊signal

Python中對信號處理的模塊主要是使用signal模塊,但signal主要是針對Unix系統,所以在Windows平台上Python不能很好的發揮信號處理的功能。

要查看Python中的信號量,可以使用dir(signal)來查看。

signal.signal()

在signal模塊中,主要是使用signal.signal()函數來預設信號處理函數

singnal.signal(signalnum, handler)

其中第一個參數是信號量,第二個參數信號處理函數。

下面看個簡單的例子,其中

  • 定義了一個信號處理函數signal_handler(),用來處理程序接收到信號時執行的操作
  • 一段循環等待發送信號
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import signal
import time

def signal_handler(signum, frame):
print('Received signal: ', signum)

while True:
signal.signal(signal.SIGHUP, signal_handler) # 1
signal.signal(signal.SIGINT, signal_handler) # 2
signal.signal(signal.SIGQUIT, signal_handler) # 3
signal.signal(signal.SIGALRM, signal_handler) # 14
signal.signal(signal.SIGTERM, signal_handler) # 15
signal.signal(signal.SIGCONT, signal_handler) # 18
while True:
print('waiting')
time.sleep(1)

運行上面的程序

python test.py

然后另外開一個終端,找到對應的進程,並執行下面的kill操作

kill -1 <pid>
kill -2 <pid>
kill -3 <pid>
kill -14 <pid>
kill -15 <pid>
kill -18 <pid>
kill -9 <pid> # 最后殺死進程

此時可以看到test.py的輸出,打印的就是具體接收到的信號。

這里注意一點就是程序中注冊了SIGINT信號,所以在運行程序后使用CTRL+C並不能結束進程,而是仍然打印進程接收到的信號。

signal.alarm()

另外,signal模塊提供了一個很有用的函數signal.alarm(),它用於在一定時間后向進程自身發送SIGALRM信號,比如下面的例子設置5秒后向自己發送一個SIGALRM信號。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import signal
import time

def signal_handler(signum, frame):
print('Received signal: ', signum)

while True:
signal.signal(signal.SIGALRM, signal_handler) # 14
signal.alarm(5)
while True:
print('waiting')
time.sleep(1)

參考

轉載請以鏈接形式標明本文地址
本文地址:http://blog.csdn.net/kongxx/article/details/50976802


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com