Pergunta

Gostaria de saber como você pode implementar um programa semelhante ao tail -f em C/C++, um programa que observa e processa novas linhas adicionadas a um arquivo de log?

Foi útil?

Solução

Você pode usar fseek() para limpar a condição eof no stream.Essencialmente, leia até o final do arquivo, durma um pouco, fseek() (sem alterar sua posição) para limpar eof, leia novamente até o final do arquivo.lave, enxágue, repita.man fseek(3) para detalhes.

Aqui está o que parece em perl.seek() do perl é essencialmente um wrapper para fseek(3), então a lógica é a mesma:

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

Então, em outra sessão:

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

E voltando à saída original do programa:

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

Outras dicas

Acho que o que você está procurando é a chamada select() em c/c++.Encontrei uma cópia da página de manual aqui: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html.Select usa descritores de arquivo como argumentos e informa quando um deles foi alterado e está pronto para leitura.

O programa final é de código aberto, então você pode fazer referência a ele.Eu me perguntei a mesma coisa e olhei o código há algum tempo, pensando que seria bem simples, mas fiquei surpreso com o quão complexo era.Existem muitas dicas que devem ser levadas em consideração.

Veja aqui

Você pode chamar o tail e recuperar o stream de volta para seu aplicativo ou, como é de código aberto, talvez tentar inseri-lo em seu próprio código.

Além disso, é possível em C++ iostream abrir um arquivo apenas para visualização e apenas ler até o final, enquanto armazena em buffer as últimas 10 a 20 linhas e, em seguida, produza isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top