在 Windows 中,我试图创建一个等待 SIGINT 信号的 python 进程。当它接收到 SIGINT 时,我希望它只打印一条消息并等待另一次 SIGINT。所以我使用了信号处理程序。
这是我的 signal_receiver.py 代码。
import signal, os, time
def handler(signum, frame):
print 'Yes , Received', signum
signal.signal(signal.SIGINT, handler)
print 'My process Id' , os.getpid()
while True:
print 'Waiting for signal'
time.sleep(10)
当这个进程运行时,我只是将 SIGINT 从其他一些 python 进程发送到这个进程,
os.kill(pid,SIGINT)
。
但当 signal_receiver.py 收到 SIGINT 时,它只是退出执行。但预期的行为是在处理函数中打印消息并继续执行。
有人可以帮我解决这个问题吗。这是 Windows 中的限制吗,因为在 Linux 中同样可以正常工作。
提前致谢。
最佳答案
当您按下 CTRL+C 时,进程会收到一个 SIGINT 并且您正在正确地捕获它,否则它会抛出一个 KeyboardInterrupt
错误。
在 Windows 上,当 time.sleep(10)
被中断时,尽管您捕获到 SIGINT,它仍然会抛出一个 InterruptedError
。只需在 time.sleep 中添加一条 try/except 语句即可捕获此异常,例如:
import signal
import os
import time
def handler(signum, frame):
if signum == signal.SIGINT:
print('Signal received')
if __name__ == '__main__':
print('My PID: ', os.getpid())
signal.signal(signal.SIGINT, handler)
while True:
print('Waiting for signal')
try:
time.sleep(5)
except InterruptedError:
pass
注意:在 Python3.x 上测试过,它应该也适用于 2.x。
关于python - Windows 中的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26061814/