Señales asíncronas y terminación de espera

Una señal asíncrona puede alterar la operación de una llamada al sistema o extensión de kernel terminando una espera larga.

Los servicios de kernel como e_block_thread, {\f2}y et_wait se ven afectados por las señales. Las siguientes opciones se proporcionan cuando se envía una señal a una hebra:

  • Retorno del servicio de kernel con un código de retorno que indica que la llamada ha sido interrumpida por una señal
  • Llamar al servicio de kernel de longjmpx para reanudar la ejecución en un contexto guardado anteriormente en el caso de una señal
  • Ignore la señal utilizando la opción short-wait , permitiendo que el servicio de kernel vuelva normalmente.

El servicio de kernel de dormir , proporcionado para la compatibilidad, también da soporte a las opciones PCATCH y SWAKEONSIG para controlar la respuesta a una señal durante la función dormir .

Anteriormente, el kernel guardó automáticamente el contexto en la entrada al manejador de llamadas del sistema. Como resultado, cualquier suspensión larga (interrumpible) que no especifique la opción PCATCH ha devuelto el control al contexto guardado cuando una señal ha interrumpido la espera. El manejador de la llamada al sistema establece entonces la variable global errno a EINTR y devuelve un código de retorno de -1 de la llamada al sistema.

El kernel, sin embargo, requiere cada llamada del sistema que puede emitir directa o indirectamente una llamada dormir sin la opción PCATCH para configurar un contexto guardado utilizando el servicio de kernel de setjmpx . Esto se hace para evitar la sobrecarga de las llamadas del sistema que manejan las esperas terminadas por las señales. Utilizando el servicio setjmpx, el sistema puede establecer un contexto guardado, que establece el código de retorno de la llamada al sistema en -1 y el valorut_errora EINTR, si una señal interrumpe una larga espera sin especificar return-from-signal.

Probablemente es más rápido y más robusto especificar return-from-signal en todas las esperas largas y utilizar el código de retorno para controlar la devolución de llamada del sistema.