2010-09-03 16 views
6

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?

Respuesta

3

señal se ejecuta en usuario modo, pero con un contexto de usuario diferente, a continuación, volver al núcleo, que volver a user_mode con ret_from_syscall. El comportamiento de la llamada al sistema cuando el manejador de señal está instalado con SA_RESTART depende de la llamada al sistema.

Una descripción de los cuales se reinician llamada al sistema se encuentra disponible en la versión reciente del signal overview manpage:

man 7 signal 

Si no se utiliza la bandera SA_RESTART, llamada al sistema no se reinicia.

+1

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. –

+0

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. –

+0

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