[Reimpreso] Resolución: signal_pending y return-ERESTARTSYS

 

A menudo veremos tales ejemplos en el código del sueño:
    if (signal_pending (actual)) {
     ret = - ERESTARTSYS ;
     volver a la derecha;
    }
    Acerca de:  ¿qué significa exactamente ERESTARTSYS

 

     -ERESTARTSYS indica que cierta llamada del sistema antes de que la función de señal se vuelva a ejecutar después de que se procese la función de señal.
En otras palabras, si hay una llamada al sistema antes de la función de señal, antes de programar la función de señal de usuario, el núcleo verificará el valor de retorno de la llamada del sistema para ver si la llamada del sistema se interrumpió debido a esta señal. Si el valor de retorno es -ERESTARTSYS, y la La señal programada tiene el atributo -ERESTARTSYS, y el sistema ejecutará la llamada del sistema después de que la función de señal de usuario regrese

 

    Este proceso, no necesita profundizar en él, conoce las funciones de la biblioteca superior. Después de recibir el valor de retorno de -ERESTARTSYS , para Linux, automáticamente volverá a llamar a esta llamada.


En cuanto a
signal_pending (current) --- "Compruebe si el proceso actual tiene procesamiento de señal y si devuelve no 0 significa que hay una señal para procesar.

Análisis de escenarios:
1. Cuando una llamada del sistema está en estado de espera, como esperar a que el búfer de entrada esté vacío, se genera una señal en este momento. Esta señal solo se identifica en la estructura thread_info del proceso, que se denomina "señalización" , Y luego despierte la llamada del sistema del proceso. Después de que la llamada del sistema se active, solo use signal_pending () para verificar si hay una señal. Aquí, la señal no se procesa. Cuando hay una señal en este momento, la llamada del sistema devuelve ERESTARTSYS. el espacio de usuario a cambio, llama a la función de procesamiento de señal correspondiente en base thread_info bandera de la señal, esto se llama "señal recibida",
para Linux, la función de la biblioteca superior devuelve el valor del sistema se reinicia según llamadas llamada al sistema ERESTARTSYS, y para Solaris Hará que la llamada al sistema falle. En Linux, la llamada al sistema reiniciado verificará nuevamente el búfer, está vacío, lo que indica que la señal en este momento no es una señal de que el búfer tiene datos, continúe esperando, repita el proceso en este momento, no está vacío, solo puede procesar directamente los datos, los extremos de llamada del sistema normalmente
Nota: El "señalización" Sólo el thread_info identidad, comprobar la llamada al sistema de señales de despertar, simplemente
signal_pending () cuando un juez para ver si hay alguna identificación de señales, un verdadero "para aceptar la señal" se devuelve desde la llamada al sistema thread_info en, o un manejador de excepciones devoluciones, por ejemplo, cada Cuando regrese la función de procesamiento de interrupción del reloj, verifique qué señal en thread_info y llame al programa de procesamiento correspondiente para
complementar: Para Solaris, la situación anterior, lectura está esperando, el búfer está lleno, activa el proceso de lectura, diferente de lo que hablamos aquí. Señal "



Compruebe si el proceso p tiene alguna señal pendiente (si el bit TIF_SIGPENDING en p-> thread_info-> flags está configurado)
--------------------------- --------------------------
static inline int signal_pending (struct task_struct * p)
{
    return improbable (test_tsk_thread_flag (p, TIF_SIGPENDING));
}

Transferencia desde: Resolución: signal_pending y return-ERESTARTSYS

91 artículos originales publicados · 17 elogiados · 50,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_23327993/article/details/104946148
Recomendado
Clasificación