Как python обрабатывает сигнал?

Каков рабочий процесс обработки сигнала в python? Я установил обработчик сигнала, когда возникает сигнал, как python вызывает мою функцию? ОС вызывает его так же, как программу C? Если я нахожусь в расширении C Python, он немедленно прерывается?


Теперь мне ясно, как процесс python обрабатывает сигнал. Когда вы устанавливаете сигнал сигнальным модулем, модуль регистрирует функцию signal_handler (см. $src/Modules/signalmodule.c), которая устанавливает ваш обработчик и помечает его как 1(Handlers[sig_num].tripped = 1;) , а затем вызывает Py_AddPendingCall, чтобы сообщить интерпретатору Python. Интерпретатор Python вызовет Py_MakePendingCalls для вызова PyErr_CheckSignals, который вызывает вашу функцию в основном цикле (см. $src/Python/ceval.c). свяжитесь со мной, если вы хотите поговорить об этом: [email protected]


person renenglish    schedule 21.06.2011    source источник


Ответы (2)


Если вы установите обработчик сигналов кода Python с помощью модуля signal, интерпретатор запустит его только тогда, когда он повторно войдет в интерпретатор байт-кода. Обработчик не запускается сразу. Он помещается в очередь при появлении сигнала. Если путь кода в настоящее время находится в коде C, встроенном модуле или модуле расширения, обработчик откладывается до тех пор, пока код C не вернет управление интерпретатору байтового кода Python. Это может быть долгое время, и вы не можете точно предсказать, как долго.

В частности, если вы используете интерактивный режим с включенным readline, ваш обработчик сигналов не будет работать, пока вы не дадите ему какие-либо данные для интерпретации. это связано с тем, что входной код находится в библиотеке readline (код C) и не возвращается интерпретатору, пока не будет завершена строка.

person Keith    schedule 21.06.2011
comment
Итак, интерпретатор Python обрабатывает сигнал и вызывает мою функцию. Я хочу знать, как это происходит. Я прочитал ignalmodule.c, функции Python добавляются к массиву, а PyErr_CheckSignals вызывает функцию, которая запущена. Однако где вызывается PyErr_CheckSginals, когда ОС отправляет сигнал? - person renenglish; 21.06.2011
comment
Он не вызывается, когда ОС отправляет сигнал. Он явно вызывается в различных местах интерпретатора, когда могут быть запущены обработчики сигналов, например, при печати, чтении пользовательского ввода и т. д. Он запускает очередь обработчиков прерываний. - person Keith; 21.06.2011
comment
Большое спасибо! Теперь мне ясно, как процесс python обрабатывает сигнал. Когда вы устанавливаете сигнал сигнальным модулем, модуль регистрирует функцию signal_handler (см. $src/Modules/signalmodule.c), которая устанавливает ваш обработчик и помечает его как 1(Handlers[sig_num].tripped = 1;), затем вызовите Py_AddPendingCall, чтобы сообщить интерпретатору Python. Интерпретатор Python будет вызывать Py_MakePendingCalls для вызова PyErr_CheckSignals, который вызывает вашу функцию в почтовом цикле (см. $src/Python/ceval.c). - person renenglish; 21.06.2011

Взгляните на модуль сигнала. Если вы вызываете сигнал для скрипта Python, насколько я понимаю, если для него есть обработчик, он сначала обработает этот сигнал и потенциально сможет обрабатывать и игнорировать определенные сигналы. т.е. вместо уничтожения SIGKILL вы пытаетесь выполнить некоторую работу по очистке завершения работы перед уничтожением.

person platinummonkey    schedule 21.06.2011