Так у меня есть этот код (частично взято из питона Документов):Python signal.signal предотвращает распространение?
import signal
def handler(signum, frame):
print 'Signal handler called with signal', signum
s = signal.signal(signal.SIGINT, handler)
some_fancy_code() # this code is using subprocess.Popen() to call another script
singal.signal(signal.SIGINT, s)
То, что я нашел прямо сейчас, что если я Ctrl + C в моей программе, он правильно поступает, что обработчик и печатает. Теперь, я думал, что после получения Ctrl + C мой обработчик будет подавлять обработчик по умолчанию, поэтому, например, мой подпроцесс. Popen не получит сигнал KeyboardInterrupt. Но это не так.
Но когда мы заменяем «обработчик» на «signal.SIG_IGN», это распространение никогда не происходит. Модифицированный фрагмент кода:
import signal
s = signal.signal(signal.SIGINT, signal.SIG_IGN)
some_fancy_code() # this code is using subprocess.Popen() to call another script
singal.signal(signal.SIGINT, s)
Является ли это потому, что SIG_IGN является своим родом сигнала «волшебного», написанным в самом языке? Или, может быть, есть способ сделать подобное подавление в моем собственном обработчике?
После прочтения вопроса о переполнении стека я немного смущен. Если бы кто-то мог объяснить мне, почему такая разница в поведении.