2008-09-29 7 views
11

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?cómo evitar los bloques de Fgets cuando la secuencia de archivos no tiene datos nuevos

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 (consulte this post).

Respuesta

0

I utilizaría las funciones POSIX para IO en lugar de las de la biblioteca C, puede usar select o poll.

0

En cambio, 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 *.

+0

esto fue solo un ejemplo. la idea es extraer datos y pasarlos a través de un objeto mutex a una instancia flash. – SinisterDex

15

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

Querrá realizar la E/S asincrónica usando 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 mango FILE*, recuperado por: int fd = fileno(f);

+1

Definitivamente use select() - si tiene un FILE * y necesita un descriptor de archivo, use fileno(). Si tiene un descriptor de archivo y necesita un ARCHIVO *, use fdopen(). – plinth

+0

Buena sugerencia, editado para incluir fileno. – Sufian

+0

Desafortunadamente, creo que select() no funciona en las tuberías en Windows. – Roddy

25

En Linux (o cualquier sistema operativo Unix-y), se puede marcar el descriptor de fichero subyacente utilizado por popen() para ser no bloqueando

#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 EWOULDBLOCK.

0

resolví mis problemas mediante el uso de hilos, específicamente _beginthread , _beginthreadex.

+1

Si respondió su propia pregunta, establezca esto como la respuesta y posiblemente publique su solución. –

Cuestiones relacionadas