2014-09-26 128 views
0

在Windows中,我试图创建一个等待SIGINT信号的python进程。当它接收到SIGINT时,我希望它只是打印一条消息并等待SIGINT的另一个出现。所以我使用了信号处理程序。Windows中的信号处理

这是我的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) 

当这个进程在运行,我刚刚从其他Python过程中使用发送SIGINT这个procees,

os.kill(pid,SIGINT)

但是,当signal_receiver.py收到SIGINT时,它只是退出执行。但预期的行为是在处理函数内部打印消息并继续执行。

有人可以帮我解决这个问题。它在windows中是一个限制,因为在linux中同样工作正常。

在此先感谢。

+0

Windows没有信号。 Python正在模拟它们,但可能不支持跨进程。考虑使用其中一种本地IPC方法。 – 2014-09-28 00:37:11

+0

[根据此答案](http://stackoverflow.com/a/26053962/886887)Python不支持跨进程信号。 – 2014-09-28 00:44:27

回答

1

当您按下CTRL + C时,进程收到一个SIGINT,并且您正确捕获它,否则它会抛出一个KeyboardInterrupt错误。

在Windows上,当time.sleep(10)中断时,尽管您捕获了SIGINT,但它仍会抛出InterruptedError。只需添加一个try /除了内部time.sleep语句来捕获这个异常,例如:

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协同工作。

+0

它不适用于Windows 7,Python 2.7 – wap26 2016-07-18 13:28:33