版本信息:
- 操作系统:Windows 7
- Python版本3.3.5
下面是我在玩的一小段测试代码.这样做的目的是忽略在执行某些代码时按下CTRL-C
键,然后恢复CTRL-C
行为.
import signal
import time
try:
# marker 1
print('No signal handler modifications yet')
print('Sleeping...')
time.sleep(10)
# marker 2
signal.signal(signal.SIGINT, signal.SIG_IGN)
print('Now ignoring CTRL-C')
print('Sleeping...')
time.sleep(10)
# marker 3
print('Returning control to default signal handler')
signal.signal(signal.SIGINT, signal.SIG_DFL)
print('Sleeping...')
time.sleep(10)
except KeyboardInterrupt:
print('Ha, you pressed CTRL-C!')
我在玩这个游戏时观察到:
- 在marker 1和marker 2之间发送的
CTRL-C
将由异常处理程序处理(如预期). - 在marker 2和marker 3之间发送的
CTRL-C
被忽略(仍然如预期的那样) - 处理marker 3后发送
CTRL-C
,但not将跳转到异常处理程序.相反,Python只是terminates immediately.
同时,考虑一下:
>>>import signal
>>>signal.getsignal(signal.SIGINT)
<built-in function default_int_handler>
>>> signal.getsignal(signal.SIGINT) is signal.SIG_DFL
False
>>> signal.signal(signal.SIGINT, signal.SIG_DFL)
<built-in function default_int_handler>
>>> signal.getsignal(signal.SIGINT) is signal.SIG_DFL
True
因此,最初,虽然信号处理程序被认为是默认的信号处理程序,但它似乎与SIG_DFL
定义的处理程序不同.
如果有人能对此有所了解,尤其是在将信号处理程序恢复到SIG_DFL后忽略异常处理程序时.