Je me demande comment vous pouvez implémenter un programme similaire à tail -f
en C/C++, un programme qui surveille et traite les nouvelles lignes ajoutées à un fichier journal?Implémentation d'un observateur de journaux
Répondre
Vous pouvez utiliser fseek() pour effacer la condition eof sur le flux. Essentiellement, lisez à la fin du fichier, dormez pendant un moment, fseek() (sans changer votre position) pour effacer eof, la lecture à la fin du fichier à nouveau. laver, rincer, répéter. man fseek (3) pour plus de détails.
Voici à quoi ça ressemble en perl. Perl seek() est essentiellement une enveloppe pour fseek (3), de sorte que la logique est la même:
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
Puis, dans une autre session:
wembley 0 /home/jj33/swap > echo "another line of text" >> tfile
Et de retour à la sortie du programme original:
Hit EOF, sleeping
Got: another line of text
Hit EOF, sleeping
Vous pouvez soit appeler à la queue et de récupérer le flux de retour dans votre application, ou comme il est open source, peut-être essayer de tirer dans votre propre code.
En outre, il est possible en C++ iostream d'ouvrir un fichier pour l'affichage uniquement et juste de lire jusqu'à la fin, tout en tamponnant les 10-20 dernières lignes, puis de le sortir.
Je pense que ce que vous cherchez est l'appel select() en c/C++. J'ai trouvé une copie de la page de manuel ici: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html. Select prend les descripteurs de fichiers comme arguments et vous indique quand l'un d'entre eux a changé et est prêt à être lu.
Le programme queue est open source, vous pouvez donc faire référence à cela. Je me suis posé la même question et j'ai regardé le code tout à l'heure, pensant que ce serait assez simple, mais j'ai été surpris de voir à quel point c'était complexe. Il y a beaucoup de pièges à prendre en compte.