implementação personalizada do "tail -f" funcionalidade em C

votos
2

EDIT: eu usei, finalmente, iNotify. Como diz stefanB, inotify é a coisa para usar. Eu encontrei um clone cauda que usa inotify para implementar o modo -f, inotail .

texto da pergunta original:

Eu estou tentando implementar a lógica tail -f em um projeto C, para fins de prototipagem eu desenvolvi-lo em python como segue:


    # A forever loop, each 5 seconds writes a line into file.txt
    from time import *

    while 1:
        sleep(5)
        file = open(file.txt, a)
        file.write(This is a test\n)
        file.close()

O próximo código segue o eof de file.txt (atualizado pelo código acima)


    # tail -f 
    from time import *

    file = open(file.txt, r)
    file.seek(0, 2)

    while 1:
      line = file.readline()
      if not line:
          sleep(1)
      else:
          print line

    file.close()

Tudo funciona bem, mas a implementação C não está funcionando (há nenhum código de verificação de erros). A inclusão de stdio.h, string.h e unistd.h é omitido (a coloração esconde o código de inclusão de cabeçalho).


    #define LINE_LEN 256

    int main(int argc, char **argv)
    {
        FILE *f;
        char line[LINE_LEN];

        f = fopen(file.txt, r);

        fseek(f, 0, SEEK_END);

        while (1)
        {
            fgets(line, LINE_LEN, f);

            if (strlen(line) == 0)
            {
                sleep(1);
            }
            else
            {
                printf(Readed: %s, line);
            } 
        }

        fclose(f);

        return 0;
    }

Alguma idéia?

É uma boa ideia implementá-lo com uma poll () em vez da solução apresentada ?.

Desde já, obrigado.

Publicado 19/05/2009 em 17:27
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

EDIT : Parece que inotify é a coisa para usar. Deve ser incluído no kernel do Linux desde 2.6.13. Um artigo da IBM developerWorks sobre inotify .

resposta anterior:

Dê uma olhada no Linux arquivo Alteration Monitor (em linux kernels 2.4.x>). É uma estrutura que permite que você se inscrever para alterações de arquivo e você recebe retorno de chamada de kernel quando a mudança acontece. Isso deve ser melhor do que polling.

Exemplos como pesquisar para alterações de arquivos, veja seções espera de alterações de arquivo e pesquisa para alterações de arquivo .

Eu não tentei ainda.

Respondeu 19/05/2009 em 17:39
fonte usuário

votos
3

Uma vez que um arquivo * tem visto um erro ou EOF, tem seu estatuto interno definido para que ele continua a retornar erro ou EOF em chamadas subseqüentes. Você precisa chamar clearerr(f);após o sono retorna para limpar a configuração eof e obtê-lo para tentar ler mais dados do arquivo.

Respondeu 19/05/2009 em 17:35
fonte usuário

votos
2

A partir da tail página do homem :

-f Não pare quando é atingido fim-de-arquivo, mas em vez de esperar por dados adicionais a serem anexados à entrada. Se o arquivo é substituído (ou seja, o número inode muda), cauda vai reabrir o arquivo e continuar. Se o arquivo é truncado, cauda irá redefinir a sua posição para o início. Isso faz com que a cauda mais útil para assistir arquivos de log que pode ficar rodado. A opção -f é ignorada se a entrada padrão é um tubo, mas não se isso é um FIFO.

Então, você poderia fazer a mesma coisa:

  1. Use stat () para ler o número inode do arquivo
  2. Exibir o conteúdo do arquivo. Armazenar a posição do descritor de arquivo, por exemplo, p = ftell (fd)
  3. Use stat () novamente, e ver se o inode mudou. Se assim for, exibir o conteúdo do arquivo a partir de posição p em diante
  4. Repetir
Respondeu 19/05/2009 em 17:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more