Mientras el proceso está ejecutando una llamada al sistema de bloqueo, por ejemplo, leer o escribir, la señal ha llegado. ¿La llamada al sistema finaliza con el error EINTR? ¿La llamada al sistema se reinicia después de manejar la llamada al sistema?Problema con el manejo de señales, manejo de interrupciones
Supongamos que la llamada al sistema finaliza con el error EINTR, Kernel maneja la señal antes de reticular en el espacio del usuario.
¿El control de señal se ejecuta en modo de usuario/modo kernel? Si está en modo de usuario, ¿regresará a la instrucción después de la llamada al sistema (lectura/escritura) durante la cual llegó la señal o de nuevo al modo núcleo después de manejar la señal y regresa al usuario desde ret_from_syscall? ¿Cómo se reanuda la ejecución en la instrucción junto a la llamada al sistema durante la cual llegó la señal?
¿Es posible reiniciar el sistema pasando el indicador SA_RESTART en sigaction?
Ahora entiendo lo que quiere decir con que la señal se ejecuta en modo de usuario con un contexto de usuario diferente. En caso de que el proceso reciba una señal, el proceso cambia al modo kernel para manejar la excepción en la que se establece la máscara de bits del conjunto de señales del proceso actual. Justo antes de regresar al modo de usuario, kernel verifica la señal pendiente y llama a la función do_signal para manejar la señal que a su vez llama a handle_signal que copia el contexto de hardware del núcleo y modifica la pila de modo de usuario invocando setup_frame. –
El nuevo marco de pila contiene signum, valor de PC apuntando al controlador de señal de modo de usuario, campo de dirección de retorno que contiene la dirección de la llamada al sistema sigreturn. Cuando el proceso vuelve al modo de usuario, comienza a ejecutar el manejador de señal y al terminar ejecuta sigreturn, lo que hace que el proceso cambie al modo kernel donde en el contexto de hardware de la pila de modo de usuario se copia a la pila kernel mediante restore_sigcontext (restaurar la pila de modo de usuario a estado original). Cuando la llamada al sistema sigreturn termina, el proceso vuelve al modo de usuario y continúa desde donde está antes de la señal. –
Es importante notar que SA_RESTART no siempre se aplica. Algunas interfaces nunca se reinician después de ser interrumpidas por un manejador de señal, independientemente del uso de SA_RESTART; siempre fallan con el error EINTR cuando se interrumpe por un manejador de señal. Verifique [Página del manual de la señal para más detalles] (http://man7.org/linux/man-pages/man7/signal.7.html). – kikeenrique