2014-09-26 3 views
0

В Windows я пытаюсь создать процесс python, ожидающий сигнал SIGINT. И когда он получает SIGINT, я хочу, чтобы он просто распечатывал сообщение и ждал другого появления SIGINT.So я использовал обработчик сигналов.Обработка сигналов в 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) 

Когда этот процесс работает, я просто отправить SIGINT к этому procees из другого процесса питона с помощью,

os.kill(pid,SIGINT).

Но когда signal_receiver.py получает SIGINT, он просто завершает выполнение. Но ожидаемое поведение заключается в том, чтобы напечатать сообщение внутри функции обработчика и продолжить выполнение.

Может кто-нибудь, пожалуйста, помогите мне решить эту проблему. Это ограничение в Windows, потому что то же самое отлично работает в Linux.

Заранее спасибо.

+0

Windows не имеет сигналов. Python имитирует их для вас, но может не поддерживать это через процессы. Подумайте об использовании одного из родных методов IPC. –

+0

[В соответствии с этим ответом] (http://stackoverflow.com/a/26053962/886887) Python не поддерживает сигналы перекрестного процесса. –

ответ

1

Когда вы нажимаете CTRL + C, процесс получает SIGINT, и вы правильно его поймаете, потому что в противном случае он бы выбросил ошибку KeyboardInterrupt.

В Windows, когда time.sleep(10) прерван, хотя вы поймаете SIGINT, он по-прежнему выбрасывает InterruptedError. Просто добавьте попробовать/за исключением заявления внутри 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

Смежные вопросы