Почему signal.SIGALRM не работает в Python на Windows?

1

Я пытаюсь понять концепции ОС и библиотеки 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 не работает над окнами?

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

Но когда я запускаю программу, она дает мне следующую ошибку в 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'

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

  • 0
    Потому что у Windows нет такого сигнала.
  • 0
    Так как у него не будет /dev/ttyS0 .
Теги:
python-3.x
signals

1 ответ

2
Лучший ответ

Есть ли какая-то конкретная причина, почему singal.SIGALRM не работает над окнами?

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

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

и signal.alarm() документируется как:

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

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

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

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

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

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

  • 0
    Хорошо. Итак, есть ли альтернатива для SIGALRM, которая может делать более или менее то же самое в Windows?
  • 1
    @Anudeep: я уже связался с сообщением, которое говорит об альтернативе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню