Pregunta

Me pregunto cómo se puede implementar un programa similar a tail -f en C/C++, ¿un programa que busca y procesa nuevas líneas agregadas a un archivo de registro?

¿Fue útil?

Solución

Puede usar fseek() para borrar la condición eof en la transmisión.Básicamente, lea hasta el final del archivo, duerma un rato, fseek() (sin cambiar su posición) para borrar eof, vuelva a leer hasta el final del archivo.lavar, enjuagar, repetir.man fseek(3) para más detalles.

Así es como se ve en Perl.seek() de Perl es esencialmente un contenedor para fseek(3), por lo que la lógica es la misma:

wembley 0 /home/jj33/swap >#> cat p
my $f = shift;
open(I, "<$f") || die "Couldn't open $f: $!\n";

while (1) {
  seek(I, 0, 1);
  while (defined(my $l = <I>)) {
    print "Got: $l";
  }
  print "Hit EOF, sleeping\n";
  sleep(10);
}
wembley 0 /home/jj33/swap >#> cat tfile
This is
some
text
in
a file
wembley 0 /home/jj33/swap >#> perl p tfile
Got: This is
Got: some
Got: text
Got: in
Got: a file
Hit EOF, sleeping

Luego, en otra sesión:

wembley 0 /home/jj33/swap > echo "another line of text" >> tfile

Y volvamos a la salida del programa original:

Hit EOF, sleeping
Got: another line of text
Hit EOF, sleeping

Otros consejos

Creo que lo que estás buscando es la llamada select() en c/c++.Encontré una copia de la página de manual aquí: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html.Select toma los descriptores de archivos como argumentos y le indica cuándo uno de ellos ha cambiado y está listo para leer.

El programa tail es de código abierto, por lo que puedes hacer referencia a eso.Me pregunté lo mismo y miré el código hace un tiempo, pensando que sería bastante simple, pero me sorprendió lo complejo que era.Hay muchas trampas que deben tenerse en cuenta.

Mira aquí

Puede llamar para seguir y recuperar la transmisión nuevamente en su aplicación o, como es de código abierto, tal vez intentar incorporarla a su propio código.

Además, en C++ iostream es posible abrir un archivo para verlo únicamente y leerlo hasta el final, mientras se almacenan en el búfer las últimas 10 a 20 líneas y luego se genera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top