signal — Установка обработчиков асинхронных событий
Этот модуль предоставляет механизмы для использования обработчиков сигналов в Python. Некоторые общие правила работы с сигналами и их обработчиками:
- Обработчик для определенного сигнала, после установки, остается установленным до его явного сброса (Python эмулирует интерфейс стиля BSD независимо от базовой реализации), за исключением обработчика для
SIGCHLD, который следует базовой реализации. - Нет способа временно «заблокировать» сигналы из критических секций (так как это не поддерживается всеми вариантами Unix).
- Хотя обработчики сигналов Python вызываются асинхронно, насколько это касается пользователя Python, они могут происходить только между «атомными» инструкциями интерпретатора Python. Это означает, что сигналы, поступающие во время длительных вычислений, реализованных исключительно на C (например, соответствия регулярным выражениям на больших объемах текста), могут быть задержки на произвольное время.
- Когда сигнал поступает во время операции ввода-вывода, возможно, что операция ввода-вывода сгенерирует исключение после возврата обработчика сигнала. Это зависит от семантики прерванных системных вызовов в базовой системе Unix.
- Поскольку обработчик C-сигналов всегда возвращается, бессмысленно ловить синхронные ошибки, такие как
SIGFPEилиSIGSEGV. - Python по умолчанию устанавливает небольшое количество обработчиков сигналов:
SIGPIPEигнорируется (чтобы ошибки записи в трубы и сокеты могли быть сообщены как обычные исключения Python) иSIGINTпреобразуется в исключениеKeyboardInterrupt. Все эти значения могут быть переопределены. - Необходимо проявлять осторожность, если в одной программе используются как сигналы, так и потоки. Основное, что нужно помнить при одновременном использовании сигналов и потоков: всегда выполняйте операции
signal()в главном потоке выполнения. Любой поток может выполнитьalarm(),getsignal(),pause(),setitimer()илиgetitimer(); только главный поток может установить новый обработчик сигнала, и только главный поток будет получать сигналы (это обеспечивается модулем Pythonsignal, даже если базовая реализация потоков поддерживает отправку сигналов отдельным потокам). Это означает, что сигналы не могут использоваться в качестве средства межпотоковой связи. Используйте блокировки вместо этого.
Переменные, определенные в модуле signal:
-
signal.SIG_DFL -
Это один из двух стандартных вариантов обработки сигналов; он просто выполнит стандартную функцию для сигнала. Например, на большинстве систем стандартное действие для
SIGQUIT— вывести core dump и выйти, в то время как стандартное действие дляSIGCHLD— просто игнорировать его.
-
signal.SIG_IGN -
Это другой стандартный обработчик сигналов, который просто проигнорирует данный сигнал.
-
SIG* -
Все номера сигналов определены символически. Например, сигнал отключения определен как
signal.SIGHUP; имена переменных идентичны именам, используемым в C-программах, как и в<signal.h>. Страница руководства Unix для ‘signal()’ перечисляет существующие сигналы (на некоторых системах это signal(2), на других — список находится в signal(7)). Обратите внимание, что не все системы определяют один и тот же набор имен сигналов; в этом модуле определены только те имена сигналов, которые определены системой.
-
signal.CTRL_C_EVENT -
Сигнал, соответствующий событию нажатия клавиши Ctrl+C. Этот сигнал может использоваться только с
os.kill().Доступность: Windows.
Новая версия 2.7.
-
signal.CTRL_BREAK_EVENT -
Сигнал, соответствующий событию нажатия клавиши Ctrl+Break. Этот сигнал может использоваться только с
os.kill().Доступность: Windows.
Новая версия 2.7.
-
signal.NSIG -
На единицу больше, чем номер наибольшего номера сигнала.
-
signal.ITIMER_REAL -
Уменьшает таймер интервала в реальном времени и отправляет
SIGALRMпри истечении срока.
-
signal.ITIMER_VIRTUAL -
Уменьшает таймер интервала только при выполнении процесса и отправляет SIGVTALRM при истечении срока.
-
signal.ITIMER_PROF -
Уменьшает таймер интервала как при выполнении процесса, так и при выполнении системы от имени процесса. В паре с ITIMER_VIRTUAL этот таймер обычно используется для профилирования времени, затрачиваемого приложением в пользовательском и системном пространстве. SIGPROF отправляется при истечении срока.
Модуль signal определяет одно исключение:
-
exception signal.ItimerError -
Выбрасывается для сигнализации об ошибке из базовой реализации
setitimer()илиgetitimer(). Ожидайте эту ошибку, если вsetitimer()передается недействительный таймер интервала или отрицательное время. Это исключение является подтипомIOError.
Модуль signal определяет следующие функции:
-
signal.alarm(time) -
Если time не равно нулю, эта функция запрашивает отправку сигнала
SIGALRMпроцессу через time секунд. Любой ранее запланированный сигнал тревоги отменяется (одновременно может быть запланирована только одна тревога). Возвращаемое значение — количество секунд до того, как будет доставлен любой ранее установленный сигнал тревоги. Если time равно нулю, сигнал тревоги не планируется, и любой запланированный сигнал тревоги отменяется. Если возвращаемое значение равно нулю, сигнал тревоги в настоящее время не запланирован. (См. страницу руководства Unix alarm(2).) Доступность: Unix.
-
signal.getsignal(signalnum) -
Возвращает текущий обработчик сигнала для сигнала signalnum. Возвращаемое значение может быть вызываемым объектом Python или одним из специальных значений
signal.SIG_IGN,signal.SIG_DFLилиNone. Здесьsignal.SIG_IGNозначает, что сигнал был ранее проигнорирован,signal.SIG_DFLозначает, что ранее использовался стандартный способ обработки сигнала, иNoneозначает, что предыдущий обработчик сигнала не был установлен из Python.
-
signal.pause() -
Заставляет процесс находиться в ожидании получения сигнала; затем будет вызван соответствующий обработчик. Ничего не возвращает. Не поддерживается в Windows. (См. страницу руководства Unix signal(2).)
-
signal.setitimer(which, seconds[, interval]) -
Устанавливает заданный таймер интервала (один из
signal.ITIMER_REAL,signal.ITIMER_VIRTUALилиsignal.ITIMER_PROF), указанный параметром which, для срабатывания через seconds (принимается float, в отличие отalarm()) и после этого каждые interval секунд. Таймер интервала, заданный which, может быть очищен, установив seconds равным нулю.При срабатывании таймера интервала процессу отправляется сигнал. Отправляемый сигнал зависит от используемого таймера;
signal.ITIMER_REALотправляетSIGALRM,signal.ITIMER_VIRTUALотправляетSIGVTALRM, аsignal.ITIMER_PROFотправляетSIGPROF.Старые значения возвращаются в виде кортежа: (delay, interval).
Попытка передачи недействительного таймера интервала вызовет
ItimerError. Доступность: Unix.Новая версия 2.6.
-
signal.getitimer(which) -
Возвращает текущее значение заданного таймера интервала, указанного параметром which. Доступность: Unix.
Новая версия 2.6.
-
signal.set_wakeup_fd(fd) -
Установите fd для пробуждения в fd. При получении сигнала, в fd записывается байт
'\0'. Это можно использовать библиотеке для пробуждения вызова poll или select, позволяя полностью обработать сигнал.Возвращается старый fd для пробуждения (или -1, если пробуждение по файловому дескриптору не было включено). Если fd равен -1, пробуждение по файловому дескриптору отключается. Если не равно -1, fd должен быть неблокирующим. Библиотека должна удалить все байты из fd перед повторным вызовом poll или select.
Когда включены потоки, эту функцию можно вызывать только из основного потока; попытка вызвать её из других потоков приведёт к исключению
ValueError.Введено в версии 2.6.
-
signal.siginterrupt(signalnum, flag) -
Изменить поведение перезапуска системных вызовов: если flag равен
False, системные вызовы будут перезапущены при прерывании сигналом signalnum, в противном случае системные вызовы будут прерваны. Не возвращает ничего. Доступность: Unix (см. страницу руководства siginterrupt(3) для получения дополнительной информации).Обратите внимание, что установка обработчика сигнала с помощью
signal()сбросит поведение перезапуска до прерывания, неявно вызвавsiginterrupt()со значением flag true для данного сигнала.Введено в версии 2.6.
-
signal.signal(signalnum, handler) -
Установите обработчик для сигнала signalnum в функцию handler. handler может быть вызываемым объектом Python, принимающим два аргумента (см. ниже), или одним из специальных значений
signal.SIG_IGNилиsignal.SIG_DFL. Предыдущий обработчик сигнала будет возвращён (см. описаниеgetsignal()выше). (См. страницу руководства Unix signal(2).)Когда включены потоки, эту функцию можно вызывать только из основного потока; попытка вызвать её из других потоков приведёт к исключению
ValueError.handler вызывается с двумя аргументами: номером сигнала и текущей стековой рамкой (
Noneили объектом кадра; для описания объектов кадра см. описание в иерархии типов или см. описания атрибутов в модулеinspect).В Windows,
signal()может быть вызван только сSIGABRT,SIGFPE,SIGILL,SIGINT,SIGSEGV, илиSIGTERM. В противном случае будет возбуждено исключениеValueError.
1. Пример
Вот пример минимальной программы. Она использует функцию alarm() для ограничения времени ожидания открытия файла; это полезно, если файл для последовательного устройства, которое может быть выключено, что обычно приводит к зависанию os.open() на неопределённое время. Решение состоит в установке сигнала тревоги на 5 секунд перед открытием файла; если операция занимает слишком много времени, сигнал тревоги будет отправлен, а обработчик вызовет исключение.
import signal, os
def handler(signum, frame):
print 'Signal handler called with signal', signum
raise IOError("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
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/signal.html