Реализация наблюдателя журналов
Вопрос
Мне интересно, как можно реализовать программу, подобную 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 строк, а затем вывести это.