Muchas llamadas al sistema reportarán el EINTR
código de error si se produjo una señal mientras la llamada al sistema estaba en curso. En realidad, no ocurrió ningún error, solo se informa de esa manera porque el sistema no puede reanudar la llamada del sistema automáticamente. Este patrón de codificación simplemente vuelve a intentar la llamada al sistema cuando esto sucede, para ignorar la interrupción.
Por ejemplo, esto podría suceder si el programa utiliza alarm()
para ejecutar algún código de forma asíncrona cuando se agota un temporizador. Si el tiempo de espera se agota mientras el programa está llamando a write()
, solo queremos volver a intentar la llamada del sistema (también conocida como lectura/escritura, etc.).
las respuestas aquí son realmente buenas y quiero agregar algunos detalles internos:
Las llamadas al sistema que son interrumpidas por señales pueden abortar y devolver EINTR
o reiniciarse automáticamente si y solo si SA_RESTART
se especifica en sigaction(2)
y el responsable de esta tarea es el restart_block
que solía rastrear información y argumentos para reiniciar las llamadas al sistema
Desde la página man en write
:
La llamada fue interrumpida por una señal antes de que se escribiera ningún dato