Вопрос

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

Это было полезно?

Решение

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

Вот как это выглядит в Perl.Функция Seek() в Perl по сути является оберткой для 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

Другие советы

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

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

Глянь сюда

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top