2011-06-21 25 views
5

¿Cuál es el flujo de trabajo de procesamiento de una señal en python? Configuré un manejador de señal, cuando ocurre la señal, ¿cómo invocó python mi función? ¿El sistema operativo lo invoca como el programa C? Si estoy en una extensión C de python, ¿se interrumpe de inmediato?¿Cómo procesa python una señal?


Ahora es claro para mí cómo funciona el proceso de Python con una señal. Cuando establece una señal mediante el módulo de señal, el módulo registrará una función signal_handler (consulte $ src/Modules/signalmodule.c), que configurará su controlador y lo marcará como 1 (Handlers[sig_num].tripped = 1;), luego llamará a Py_AddPendingCall para indicarle al intérprete de python. El intérprete de Python invocará Py_MakePendingCalls para llamar a PyErr_CheckSignals que llama a su función en el bucle principal (vea $ src/Python/ceval.c). comuníqueme si desea hablar sobre esto: [email protected]

Respuesta

6

Si configura un controlador de señal de código Python utilizando el módulo de señal, el intérprete solo lo ejecutará cuando vuelva a ingresar el intérprete de código de bytes. El controlador no se ejecuta de inmediato. Se coloca en una cola cuando ocurre la señal. Si la ruta del código se encuentra actualmente en el código C, en el módulo integrado o de extensión, el controlador se difiere hasta que el código C devuelva el control al intérprete de código de bytes de Python. Esto puede ser un tiempo prolongado, y no se puede predecir realmente por cuánto tiempo.

Lo más notable es que si está utilizando el modo interactivo con readline habilitado su manejador de señal no se ejecutará hasta que le dé alguna entrada para interpretar. esto se debe a que el código de entrada está en la biblioteca readline (código C) y no regresa al intérprete hasta que no tenga una línea completa.

+0

Así que el intérprete de python maneja la señal y llama a mi función. Quiero saber cómo sucede esto. Leo ignalmodule.c, los funcionamientos de python se anexan a una matriz, y PyErr_CheckSignals invocan la función que se activan. Sin embargo, ¿dónde se invoca PyErr_CheckSginals cuando el sistema operativo envía una señal? – renenglish

+0

No se invoca cuando el sistema operativo envía una señal. Se llama explícitamente en varios lugares en el intérprete cuando se pueden ejecutar controladores de señal, como al imprimir, leer la entrada del usuario, etc. Ejecuta la cola del controlador de interrupciones. – Keith

+0

¡Demasiado! Ahora está claro para mí cómo maneja el proceso Python una señal. Cuando establece una señal mediante el módulo de señal, el módulo registrará una función signal_handler (consulte $ src/Modules/signalmodule.c), que configurará su controlador y lo marcará como 1 (Handlers [sig_num] .tripped = 1;), luego llama a Py_AddPendingCall para decirle al intérprete de python. El intérprete de Python invocará Py_MakePendingCalls para llamar a PyErr_CheckSignals que llama a su función en el bucle de correo (vea $ src/Python/ceval.c). – renenglish

0

Eche un vistazo a signal module. Si invocas una señal a un script de Python, desde mi entendimiento, si hay un controlador para él, primero procesará esa señal, y posiblemente tenga la capacidad de manejar e ignorar ciertas señales. es decir. en lugar de matar en un SIGKILL, intenta realizar algún trabajo de limpieza antes de matar.

Cuestiones relacionadas