linux eintr

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?



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.