Frage

Ich frage mich, wie Sie ein ähnliches Programm implementieren können tail -f in C/C++ ein Programm, das nach neuen Zeilen sucht und diese verarbeitet, die einer Protokolldatei hinzugefügt werden?

War es hilfreich?

Lösung

Sie können fseek() verwenden, um die EOF-Bedingung im Stream zu löschen.Lesen Sie im Wesentlichen bis zum Ende der Datei, schlafen Sie eine Weile, fseek() (ohne Ihre Position zu ändern), um eof zu löschen, und lesen Sie erneut bis zum Ende der Datei.waschen, spülen, wiederholen.man fseek(3) für Details.

So sieht es in Perl aus.Perls seen() ist im Wesentlichen ein Wrapper für fseek(3), daher ist die Logik dieselbe:

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

Dann, in einer anderen Sitzung:

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

Und zurück zur ursprünglichen Programmausgabe:

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

Andere Tipps

Ich denke, was Sie suchen, ist der Aufruf von select() in c/c++.Eine Kopie der Manpage habe ich hier gefunden: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html.Select verwendet Dateideskriptoren als Argumente und teilt Ihnen mit, wenn sich einer davon geändert hat und zum Lesen bereit ist.

Das Tail-Programm ist Open Source, Sie können also darauf verweisen.Ich habe mich das Gleiche gefragt und mir vor einiger Zeit den Code angeschaut. Ich dachte, er wäre ziemlich einfach, aber ich war überrascht, wie komplex er war.Es gibt viele Fallstricke, die berücksichtigt werden müssen.

Siehe hier

Sie könnten entweder „tail“ aufrufen und den Stream wieder in Ihre App abrufen oder, da es sich um Open Source handelt, vielleicht versuchen, ihn in Ihren eigenen Code zu ziehen.

Außerdem ist es in C++ iostream möglich, eine Datei nur zum Anzeigen zu öffnen und einfach bis zum Ende zu lesen, während die letzten 10–20 Zeilen gepuffert und dann ausgegeben werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top