2009-05-19 2 views
2

EDIT: Я использовал, наконец, inotify. Как говорит stefanB, inotify - это то, что нужно использовать. Я нашел клон хвоста, который использует inotify для реализации режима -f, inotail.Пользовательская реализация функции «tail -f» в C

Оригинальный текст вопроса:

Я пытаюсь реализовать «хвост -f» логику в проекте C, в целях создания прототипов я разработал его в питон следующим образом:


    # 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() 

Следующая код следует EOF из file.txt (обновлено в коде выше)


    # 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() 

Все работает нормально, но реализация C не работает (нет кода проверки ошибок). Включение stdio.h, string.h и unistd.h опущено (раскраска скрывает код включения заголовка).


    #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; 
    } 

Некоторые идеи?

Это хорошая идея реализовать его с помощью poll() вместо представленного решения ?.

Заранее спасибо.

ответ

3

EDIT: Похоже inotify это дело использовать. Он должен быть включен в linux ядро ​​с 2.6.13. An article from IBM developerworks about inotify.

Предыдущий ответ:

Посмотрите на Linux File Alteration Monitor (В Linux ядра 2.4.x>). Это структура, позволяющая вам подписаться на изменения файлов, и вы получаете обратный вызов из ядра при изменении. Это должно быть лучше, чем опрос.

Examples как опрос для изменения файлов, проверьте разделы В ожидании изменения файла и опроса для файла изменениями.

Я еще не пробовал.

3

После того, как FILE * увидел ошибку или eof, он имеет свой внутренний статус, чтобы он продолжал возвращать ошибку или eof при последующих вызовах. Вам нужно позвонить clearerr(f); после того, как спящий режим будет сброшен, чтобы очистить настройку eof и попросить его прочитать больше данных из файла.

+0

Я пробовал, но получил то же поведение. Спасибо! –

2

От tailman page:

-f Не останавливайтесь при достижении конца из-файла, а ждать дополнительных данных, которые будут приложены к входу. Если файл заменен (т. Е. изменяется номер inode), хвост будет снова открыть файл и продолжить. Если файл усечен, хвост сбрасывает его положение в начало. Это делает хвост более полезным для просмотра журналов файлов, которые могут поворачиваться. Опция -f игнорируется, если входной сигнал стандарта является трубой, но нет, если это FIFO.

Таким образом, вы могли бы сделать то же самое:

  1. Использование stat() читать инф.узлов номер файла
  2. отображать содержимое этого файла. Сохраните положение дескриптора файла, например, p = ftell (fd)
  3. Снова используйте stat() и посмотрите, был ли изменен индекс. Если да, то вывести на экран содержимое файла с позиции р и далее
  4. Repeat
+0

Ницца! Я проигнорировал раздел man pages. Благодаря! –

Смежные вопросы