Переопределение SIGTERM isr в python 2.7 не работает в Windows 7

В приведенном ниже сценарии Python я пытаюсь поймать сигнал SIGTERM (который может быть получен из другого процесса), установив свой isr и переопределив значение по умолчанию для Python. в то время как этот скрипт отлично работает в linux (не удивительно), в windows он не работает (не удивительно)!

Как я могу получить такое же поведение в Windows 7?

Я запускаю Python 2.7 на ПК с Windows 7.

import os
import signal
import time


def instal_isr(SIGN, isr):
    signal.signal(SIGN, isr)


def sigterm_isr(SIGN, int_stack_frame):
    print 'received SIGTERM, {sign} {stackframe}'.format(sign=SIGN, stackframe=int_stack_frame)
    #do some stuf and exit
    exit(1)


def main():
    while(True):
        print 'wasting your cpu cycles'
        time.sleep(2)


if __name__=='__main__':
    instal_isr(signal.SIGTERM, sigterm_isr)
    main()

Вывод в линуксе:

wasting your cpu cycles
wasting your cpu cycles
wasting your cpu cycles
wasting your cpu cycles
received SIGTERM, 15 <frame object at 0x7f6261852dd0>

Я попытался получить соответствующую информацию из вопроса по ссылке обработка сигналов python на компьютере с Windows, ответы углубились в детали и на самом деле не охватывают этот «простой» случай.


person nor    schedule 27.04.2020    source источник
comment
В связанном ответе говорится, что Windows не реализует сигналы на системном уровне; а среда выполнения C от Microsoft реализует шесть сигналов, требуемых стандартом C: SIGINT, SIGABRT, SIGTERM, SIGSEGV, SIGILL и SIGFPE; но SIGABRT и SIGTERM реализованы только для текущего процесса; и SIGTERM бесполезен.   -  person Eryk Sun    schedule 28.04.2020
comment
Как вы убиваете процесс Python? Если через TerminateProcess, обрабатывать нечего. Это как Unix SIGKILL. Диспетчер процессов ядра безоговорочно завершает процесс без уведомления — по крайней мере, без уведомления кода пользовательского режима.   -  person Eryk Sun    schedule 28.04.2020
comment
Я постараюсь быть более точным. есть ли способ поймать сигнал уничтожения сценария Python, который был запущен одной из этих команд/инструментов Windows: 1. taskkill [python_script_pid] /F /T 2. wmic через команду завершения вызова 3. kill -f -s KILL [ python_script_pid]   -  person nor    schedule 28.04.2020
comment
Завершение WMI и taskkill с /f являются принудительным завершением, то есть TerminateProcess. Они не могут быть обработаны. taskkill без /f пытается отправить оконное сообщение WM_CLOSE в окна верхнего уровня и окна только для сообщений, которые принадлежат процессу. Окно консоли фактически принадлежит процессу, который выделяет сеанс консоли. Что касается kill, это сборка Cygwin kill для MSYS2? Если это так, я бы предположил, что он вызывает TerminateProcess, поскольку в Windows нет сигналов Unix.   -  person Eryk Sun    schedule 28.04.2020