Я пытаюсь понять концепции ОС и библиотеки 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'
Где я поступаю неправильно? Это специфично только для операционной системы?
Есть ли какая-то конкретная причина, почему singal.SIGALRM не работает над окнами?
Да, ОС Windows не реализует этот сигнал. Пример, который вы нашли, начинается с:
Вот минимальная примерная программа. Он использует функцию
alarm()
чтобы ограничить время ожидания ожидания открытия файла; [...]
и signal.alarm()
документируется как:
Доступность: Unix.
Далее в разделе SIG*
другом месте на странице документации модуля указано:
Обратите внимание, что не все системы определяют один и тот же набор имен сигналов; Этот модуль определяет только те имена, которые определены системой.
Таким образом, SIGALRM
недоступен в Windows, поэтому вместо этого вы получаете ошибку атрибута.
Обратите внимание, что Windows также не имеет виртуальной файловой системы /dev
, поэтому os.open('/dev/ttyS0', os.O_RDWR)
тоже потерпит неудачу.
См. Python: эквивалент Windows SIGALRM для альтернативы с использованием потоков.
/dev/ttyS0
.