Domanda

Mi chiedo come sia possibile implementare un programma simile a tail -f in C/C++, un programma che controlla ed elabora le nuove righe aggiunte a un file di registro?

È stato utile?

Soluzione

Puoi usare fseek() per cancellare la condizione eof sullo stream.In sostanza, leggi fino alla fine del file, dormi per un po', fseek() (senza cambiare la tua posizione) per cancellare eof, quindi leggi di nuovo fino alla fine del file.lavare, risciacquare, ripetere.man fseek(3) per i dettagli.

Ecco come appare in perl.search() di perl è essenzialmente un wrapper per fseek(3), quindi la logica è la stessa:

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

Poi, in un'altra sessione:

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

E torniamo all'output originale del programma:

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

Altri suggerimenti

Penso che quello che stai cercando sia la chiamata select() in c/c++.Ho trovato una copia della pagina man qui: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html.Select accetta i descrittori di file come argomenti e ti dice quando uno di essi è cambiato ed è pronto per la lettura.

Il programma tail è open source, quindi puoi fare riferimento a quello.Mi sono chiesto la stessa cosa e ho guardato il codice qualche tempo fa, pensando che sarebbe stato piuttosto semplice, ma sono rimasto sorpreso da quanto fosse complesso.Ci sono molti trucchi che devono essere presi in considerazione.

Vedere qui

Potresti richiamare la coda e recuperare lo streaming nella tua app oppure, poiché è open source, magari provare a inserirlo nel tuo codice.

Inoltre, in C++ iostream è possibile aprire un file solo per la visualizzazione e leggerlo fino alla fine, memorizzando nel buffer le ultime 10-20 righe, quindi emettendolo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top