Question

Je me demande comment vous pouvez mettre en œuvre un programme similaire à tail -f en C/C++, un programme qui surveille et traite les nouvelles lignes ajoutées à un fichier journal ?

Était-ce utile?

La solution

Vous pouvez utiliser fseek() pour effacer la condition eof sur le flux.Essentiellement, lisez jusqu'à la fin du fichier, dormez un moment, fseek() (sans changer de position) pour effacer eof, la lecture à nouveau jusqu'à la fin du fichier.laver, rincer, répéter.man fseek(3) pour plus de détails.

Voici à quoi cela ressemble en Perl.seek() de Perl est essentiellement un wrapper pour fseek(3), donc 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 séance :

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

Et revenons au résultat original du programme :

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

Autres conseils

Je pense que ce que vous recherchez, c'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 tail est open source, vous pouvez donc y faire référence.Je me suis posé la même question et j'ai regardé le code il y a quelque temps, pensant que ce serait assez simple, mais j'ai été surpris de voir à quel point il était complexe.Il y a de nombreux pièges dont il faut tenir compte.

Vois ici

Vous pouvez soit appeler tail et récupérer le flux dans votre application, soit, comme il est open source, essayer de l'extraire dans votre propre code.

En outre, il est possible dans C++ iostream d'ouvrir un fichier pour le visualiser uniquement et de le lire jusqu'à la fin, tout en mettant en mémoire tampon les 10 à 20 dernières lignes, puis de le sortir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top