¿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]
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
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
¡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