所以,让我说我有这个代码:
import signal
from time import sleep
def signalHandler(sig, frame):
print "signalHandler"
while True:
sleep(1)
#print "Caught" # Uncomment this line, and you get multiple signals - commented, you don't.
signal.signal(signal.SIGINT, signalHandler)
while True:
sleep(1)
如注释中所示,如果取消注释print语句,则代码正常工作,并且信号处理程序将捕获任何后续的CTRL-C按下。但是,如果留下评论,则永远不会捕获另一个信号。
这是为什么?我的猜测是连续的睡眠调用被混合在一起,并且控制永远不会回到python来捕获信号。它必须为打印声明做什么。任何人都可以对此有所了解吗?
答案 0 :(得分:1)
这确实很奇怪!
我相信这是Python生成的字节码内部与之前Python 2.7中存在的异常之间的微妙交互。请注意两件事:
如果您阅读Issue 12472 in the Python bug tracker,您会看到Python在下一条指令(在本例中为您的打印)之前插入Py_CheckSleep
的内部调用,这导致睡眠中断时捕获信号。如果没有打印件,则不会进行额外检查。
根据这个问题,这在Python 3及更高版本中得到了修复,但在早期版本中没有修复。