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.
- 1. modèle observateur ou DataBinding
- 2. Comment créer un observateur de registre Windows?
- 3. NSOpération, observateur et erreur de fil
- 4. Visionneuse de journaux distants pour les fichiers journaux Java/Glassfish
- 5. Créer un observateur d'événements pour focus?
- 6. Journaux de Panel Net Firebug
- 7. Convertir les journaux Yahoo Messenger en journaux Adium
- 8. Journaux du serveur d'applications
- 9. ASP.NET MVC: Journaux d'accès
- 10. C#: implémentation de SkipLast
- 11. Implémentation de COMET clientide
- 12. Implémentation correcte de Memento
- 13. Implémentation de l'extension inline
- 14. Implémentation de DAO Hibernate
- 15. Implémentation de MembershipUser personnalisé
- 16. UITableView - implémentation de l'index
- 17. Implémentation de l'ACID
- 18. Implémentation de IEnumerable
- 19. Implémentation de Trie
- 20. Implémentation GTK de MessageBox
- 21. Implémentation de AllowColumnReorder
- 22. Implémentation de l'interface C#
- 23. Implémentation de Chat Php
- 24. Implémentation de FindControl
- 25. Implémentation de IPostbackHandler .net
- 26. Implémentation générique de l'interface
- 27. Implémentation Silverlight de Flare
- 28. Problème avec le modèle Observateur et les génériques en Java
- 29. question Popen de gestion des journaux
- 30. Recherche de journaux sur plusieurs machines