Как python обрабатывает сигнал?
Каков рабочий процесс обработки сигнала в python ? Я устанавливаю обработчик сигнала, когда сигнал возникает, как python вызывает мою функцию? Вызывает ли ОС его точно так же, как программа C? Если я нахожусь в C extend python, это немедленно прерывается ?
Теперь мне ясно, как процесс python обрабатывает сигнал . При установке сигнала модулем signal модуль зарегистрирует функцию signal_handler (см. $src/Modules/signalmodule.c), которые устанавливают ваш обработчик и флаг это как 1 (Handlers[sig_num].tripped = 1;
) , затем вызовите Py_AddPendingCall, чтобы сообщить интерпретатору python. Интерпретатор python вызовет Py_MakePendingCalls для вызова PyErr_CheckSignals, который вызывает вашу функцию в основном цикле (см. $src / Python/ceval.с).
свяжитесь со мной, если вы хотите поговорить об этом : renenglish@gmail.com
2 ответа:
Если вы устанавливаете обработчик сигналов кода Python с помощью модуля signal, интерпретатор будет запускать его только при повторном входе в интерпретатор байт-кода. Обработчик не побежит сразу. Он помещается в очередь при появлении сигнала. Если путь кода в настоящее время находится в коде C, встроенном или расширенном модуле, обработчик откладывается до тех пор, пока код C не вернет управление интерпретатору байтового кода Python. Это может быть очень долго, и вы не можете точно предсказать, как долго.
Особенно если вы используя интерактивный режим с включенной функцией readline, обработчик сигнала не будет работать, пока вы не дадите ему некоторую информацию для интерпретации. это происходит потому, что входной код находится в библиотеке readline (C-код) и не возвращается к интерпретатору, пока не получит полную строку.
Взгляните на сигнальный Модуль . Если вы вызываете сигнал к скрипту python, из моего понимания, если есть обработчик для него, он сначала обработает этот сигнал и потенциально имеет возможность обрабатывать и игнорировать определенные сигналы. т.е.. вместо того, чтобы убивать на SIGKILL, вы пытаетесь выполнить некоторые работы по очистке выключения перед убийством.