Реализация наблюдателя журнала - PullRequest
3 голосов
/ 22 августа 2008

Мне интересно, как вы можете реализовать программу, похожую на tail -f на C / C ++, программу, которая отслеживает и обрабатывает новые строки, добавленные в файл журнала?

Ответы [ 4 ]

5 голосов
/ 22 августа 2008

Вы можете использовать fseek (), чтобы очистить условие eof в потоке. По сути, читайте до конца файла, спите некоторое время, fseek () (без изменения вашей позиции), чтобы очистить eof, снова прочитайте до конца файла. мыть, полоскать, повторять. man fseek (3) для деталей.

Вот как это выглядит в Perl. perl's seek () по сути является оберткой для fseek (3), поэтому логика та же:

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

Затем в другом сеансе:

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

И вернемся к исходному выводу программы:

Hit EOF, sleeping
Got: another line of text
Hit EOF, sleeping
0 голосов
/ 22 августа 2008

Хвостовая программа с открытым исходным кодом, так что вы можете сослаться на это. Я удивился тому же и некоторое время назад посмотрел на код, думая, что это будет довольно просто, но я был удивлен, насколько он сложен. Есть много ошибок, которые необходимо учитывать.

0 голосов
/ 22 августа 2008

Я думаю, что вы ищете, это вызов select () в c / c ++. Я нашел копию справочной страницы здесь: http://www.opengroup.org/onlinepubs/007908775/xsh/select.html. Команда Select принимает дескрипторы файлов в качестве аргументов и сообщает, когда один из них изменился и готов к чтению.

0 голосов
/ 22 августа 2008

Смотрите здесь

Вы можете либо обратиться к хвосту и получить поток обратно в ваше приложение, либо, поскольку он имеет открытый исходный код, возможно, попытаться вставить его в свой собственный код.

Кроме того, в C ++ iostream возможно открыть файл только для просмотра и просто прочитать до конца, буферизуя последние 10-20 строк, а затем вывести его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...