Python中對信號處理的模塊主要是使用signal模塊,但signal主要是針對Unix系統,所以在Windows平台上Python不能很好的發揮信號處理的功能。
要查看Python中的信號量,可以使用dir(signal)來查看。
在signal模塊中,主要是使用signal.signal()函數來預設信號處理函數
singnal.signal(signalnum, 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模塊提供了一個很有用的函數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
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。