版本信息:
- 操作系统: 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!')
在我玩弄这个过程中,我观察到:
- 在标记1和标记2之间发送的
CTRL-C
将由异常处理程序处理(正如预期)。 - 在标记2和标记3之间发送的
CTRL-C
被忽略(仍然符合预期)。 - 在标记3之后发送的
CTRL-C
会被处理,但不会跳转到异常处理程序。相反,Python会立即终止。
还要考虑以下内容:
>>>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
后忽略异常处理程序时。