Почему signal.SIGALRM не работает в Python на Windows? - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь понять концепции ОС и библиотеки Python.

Я наткнулся на конкретный пример, упомянутый в документации Python https://docs.python.org/3/library/signal.html ссылка, которая не работает для меня в Windows.

import signal, os

def handler(signum, frame):
    print('Signal handler called with signal', signum)
    raise OSError("Couldn't open device!")

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)

signal.alarm(0)          # Disable the alarm

Есть ли какая-то конкретная причина, по которой singal.SIGALRM не работает в Windows?

При автозаполнении даже отображается SIGALRM в Pycharm IDE (я предполагаю, что будет переменная или функцияесли так показывает)

Но когда я запускаю программу, она дает мне следующую ошибку в Windows.Я не проверял это в Linux.

Traceback (most recent call last):
  File "C:/Users/preddy53/Desktop/syst.py", line 8, in <module>
    signal.signal(signal.SIGALRM, handler)
AttributeError: module 'signal' has no attribute 'SIGALRM'

Где я делаю неправильно?Это относится только к операционной системе?

1 Ответ

0 голосов
/ 12 октября 2018

Существует ли какая-либо конкретная причина, по которой singal.SIGALRM не работает в Windows?

Да, ОС Windows не поддерживает этот сигнал . пример, который вы нашли , начинается с:

Вот минимальный пример программы.Он использует функцию alarm(), чтобы ограничить время ожидания открытия файла; [...]

и signal.alarm() функция задокументирована как:

Доступность: Unix.

Далее в разделе SIG* в другом месте страницы документации модуля указано:

Обратите внимание, что не все системы определяют одинаковый набор имен сигналов;только те имена, которые определены системой, определяются этим модулем.

Так что SIGALRM недоступно в Windows, поэтому вместо этого выдается ошибка атрибута.

Обратите внимание, что Windows также делаетне имеет виртуальной файловой системы /dev, поэтому вызов os.open('/dev/ttyS0', os.O_RDWR) также может завершиться ошибкой.

См. python: эквивалент Windows SIGALRM для альтернативного использования потоков.

...