Fuerza de bloqueo después de leer EAGAIN?
-
04-10-2019 - |
Pregunta
Tengo un descriptor de archivo que está abierto para la lectura que puede ser no bloqueante. Lo que tengo que hacer es simplemente leer todos los datos hasta alcanzar EOF y escribir los datos a un descriptor de archivo de escritura. A medida que el proceso que realiza esta copia no es "consciente" de todo lo que está pasando alrededor de ella, no creo que pueda hacer algo útil a la espera de los datos, y yo no quiero utilizar un bucle while
(mientras errno
no es EAGAIN
) porque creo que sería un desperdicio. ¿Hay una manera de bloquear o de otra manera, suspender la ejecución del proceso de copia hasta que se disponga de datos?
Solución
Su otra respuesta simplemente desarma O_NONBLOCK
, que fija la parte posterior archivo de bloqueo. Eso es perfectamente bien, si funciona en su situación; pero si no, se puede utilizar select()
al bloque hasta que su bloqueo no descriptor de archivo es legible.
Otros consejos
Capítulo 7 del COMO genérico SCSI de Linux (SG) da una ejemplo de cómo hacer esto:
int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));