以下代码将每5秒打印一次当前时间,并使用int_handler
处理键盘中断信号。
from signal import *
import time
from datetime import datetime
def int_handler(*args):
print 'interrupted'
signal(SIGINT, int_handler)
while True:
print datetime.now()
time.sleep(5)
但是,每次按 Ctrl - C 时,它会立即打印出当前时间,然后继续运行。
2016-06-28 18:17:19.441574
2016-06-28 18:17:24.446659
2016-06-28 18:17:29.451759
2016-06-28 18:17:34.452328
^Cinterrupted
2016-06-28 18:17:37.244227
^Cinterrupted
2016-06-28 18:17:37.692217
^Cinterrupted
2016-06-28 18:17:38.236343
^Cinterrupted
2016-06-28 18:17:38.572194
2016-06-28 18:17:43.577122
2016-06-28 18:17:48.577242
似乎中断使进程从休眠状态唤醒,处理程序被执行,并以某种方式再次返回到while循环。
有人可以向我解释原因吗?谢谢!
答案 0 :(得分:1)
来自sleep()
的文档:
实际暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获程序后终止sleep()。
https://docs.python.org/3/library/time.html#time.sleep
所以你所描述的正是发生的事情:在处理信号处理程序中的信号后,在睡眠后继续执行,这是你的while循环中的最后一个表达式。
因此,为了真正睡眠大约5秒而忽略中断,您必须在睡眠前存储时间并检查已经过了足够的时间,或者再睡一些。