linux - ¿Cuándo verificar EINTR y repetir la llamada de función?
(4)
¿Tu aplicación está impulsada por eventos? (Lo que significa que su bucle principal incluye la llamada select()/epoll_wait()
).
En una aplicación controlada por eventos, puede bloquear todas las señales y solo desbloquearlas durante la pselect()/epoll_pwait()
. De esta forma, el resto de su código nunca tendrá que tratar con EINTR.
Estoy programando una aplicación de usuario para un sistema Linux incorporado, y estoy usando las funciones comunes como abrir, cerrar, leer, ioctl, etc. para los dispositivos. Ahora, leí acerca de EINTR, indica que la función fue interrumpida por una señal, pero no estoy seguro acerca de las implicaciones. En todos los programas de ejemplo que tengo, a veces se hace, por ejemplo, ioctl (), a veces no se hace, por ejemplo, leer (). Entonces, estoy un poco confundido.
¿Cuándo consulto preferiblemente EINTR y repito la llamada a la función?
Este enlace tiene una buena explicación.
http://www.ibm.com/developerworks/linux/library/l-reent.html
¡Aclamaciones!
Tuve un problema similar cuando esperaba la entrada de una tubería con nombre con read ().
Encontré una explicación y una macro útil para primitivos en la documentación de GNU libc : TEMP_FAILURE_RETRY
Ejemplo:
TEMP_FAILURE_RETRY (read_return = read((int)example_fifo, buffer, (size_t)n));
if (read_return==-1){
fprintf(stderr, "reader.c: read_fifo: read(): %s /n", strerror(errno));
fflush(stderr);
}
Ver sigaction: http://pubs.opengroup.org/onlinepubs/009695399/functions/sigaction.html
SA_RESTART
This flag affects the behavior of interruptible functions; that is, those
specified to fail with errno set to EINTR. If set, and a function specified
as interruptible is interrupted by this signal, the function shall restart
and shall not fail with EINTR unless otherwise specified. If the flag is not
set, interruptible functions interrupted by this signal shall fail with errno
set to EINTR.
Por defecto, tiene el comportamiento SA_RESTART, por lo que no tiene que preocuparse por EINTR, si no juega con señales.