Implementación de un observador de registros
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?
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.
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.