import signal signal.signal(signalnum, handler)
signalnum
- сигнал OS.handler
- функция обработчик сигнала.Функция signal()
модуля signal
устанавливает обработчик для сигнала signalnum
на обработчик функции handler
.
Обработчик handler
может быть вызываемым объектом Python, принимающим два аргумента, или одним из специальных значений signal.SIG_IGN
или signal.SIG_DFL
.
Функция signal.signal()
возвращает предыдущий обработчик сигнала (смотрите описание функции signal.getsignal()
).
Для получения дополнительной информации смотрите справочную страницу signal(2).
Когда задействованы потоки, то функция signal.signal()
может вызываться только из основного потока. Попытка вызвать его из других потоков вызовет исключение ValueError
.
Обработчик handler
вызывается с двумя аргументами: номер сигнала signalnum
и текущий кадр стека (None
или объект кадра, описание объектов кадра можно посмотреть в описании атрибутов в модуле inspect
).
В Windows signal.signal()
может вызываться только с signal.SIGABRT
, signal.SIGFPE
, signal.SIGILL
, signal.SIGINT
, signal.SIGSEGV
, signal.SIGTERM
или signal.SIGBREAK
.
В любом другом случае будет вызываться ошибка ValueError
.
Обратите внимание, что не все системы определяют одинаковый набор имен сигналов. Если имя сигнала не определено как константа уровня модуля SIG*
будет сгенерировано исключение AttributeError
.
Пример программы, которая использует функцию OS signal.alarm()
, чтобы ограничить время ожидания открытия файла. Такое поведение полезно, если файл предназначен для последовательного устройства, которое может не включаться, что приводит к зависанию функции os.open()
на неопределенное время. Решение состоит в том, чтобы установить 5-секундную тревогу перед открытием файла. Если операция занимает слишком много времени, сигнал тревоги будет отправлен, и обработчик вызывает исключение.
import signal, os def handler_alarm(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_alarm) signal.alarm(5) # This open() may hang indefinitely with os.open('/dev/ttyS0', os.O_RDWR) as fp: # Отключить alarm signal.alarm(0) # код обработки файла ...