utilizar para libreria leer funciona fscanf fputs espacios crear con como cadenas archivos c popen fgets

para - leer cadenas con espacios en c



cómo evitar los bloques de fgets cuando el flujo de archivos no tiene datos nuevos (5)

Tengo una función popen () que ejecuta "tail -f sometextfile". A medida que haya datos en filestream, obviamente puedo obtener los datos a través de fgets (). Ahora, si no hay datos nuevos provenientes de tail, fgets () se cuelga. Intenté ferror () y feof () en vano. ¿Cómo puedo asegurarme de que fgets () no intente leer datos cuando no hay nada nuevo en la secuencia de archivos?

Una de las sugerencias fue select (). Como esto es para Windows Platform, la selección no parece funcionar, ya que las tuberías anónimas no parecen funcionar (vea esta publicación ).


En su lugar, puede intentar leer algún archivo de texto usando funciones IO de bajo nivel (abrir (), leer (), etc.), como lo hace tail. Cuando no hay nada más que leer, read () devuelve cero, pero igual intentará leer más la próxima vez, a diferencia de las funciones FILE *.


Yo usaría las funciones POSIX para IO en lugar de las de la biblioteca C, podría usar select o poll .


fgets() es una lectura de bloqueo, se supone que debe esperar hasta que los datos estén disponibles si no hay datos.

Deberá realizar E / S asincrónicas con select() , poll() o epoll() . Y luego realice una lectura del descriptor del archivo cuando haya datos disponibles.

Estas funciones utilizan el descriptor de archivo del identificador FILE* , recuperado por: int fd = fileno(f);



En Linux (o cualquier sistema operativo Unix-y), puede marcar el descriptor de archivo subyacente utilizado por popen () para que no sea bloqueante.

#include <fcntl.h> FILE *proc = popen("tail -f /tmp/test.txt", "r"); int fd = fileno(proc); int flags; flags = fcntl(fd, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(fd, F_SETFL, flags);

Si no hay ninguna entrada disponible, fgets devolverá NULL con errno establecido en EWOULDBLOCK.