все Python 3signalфункция
signal.signal()
обработчики
Ставит обработчик сигнала и возвращает прежний. Обработчик — функция (signum, frame) либо SIG_IGN / SIG_DFL.
Синтаксис
old = signal.signal(signalnum, handler)
Вызвать её можно только из главного потока главного интерпретатора — из другого потока будет ValueError, а сам обработчик тоже всегда исполняется в главном потоке, и не мгновенно, а между инструкциями байт-кода. Долгий вызов на C (регулярка по огромному тексту) обработчик не прервёт. Прежний обработчик стоит сохранить и вернуть: signal.signal возвращает его как раз для этого. На Windows допустимы только SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM и SIGBREAK, а SIGKILL и SIGSTOP не перехватываются нигде — OSError.
Примеры
import signal
got = []
old = signal.signal(signal.SIGTERM, lambda signum, frame: got.append(signum))
signal.raise_signal(signal.SIGTERM)
print(got == [signal.SIGTERM]) # → True — процесс не завершился, сработал обработчик
signal.signal(signal.SIGTERM, old) # вернуть как было
import signal, threading
def worker():
try:
signal.signal(signal.SIGINT, signal.SIG_IGN)
except ValueError as e:
print(e) # → signal only works in main thread of the main interpreter
t = threading.Thread(target=worker)
t.start()
t.join()
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности