实现日志观察器

时间:2008-08-22 13:40:33

标签: c++ c file io

我想知道如何在C / C ++中实现类似于tail -f的程序,这是一个监视并处理添加到日志文件中的新行的程序?

4 个答案:

答案 0 :(得分:5)

您可以使用fseek()清除流上的eof条件。基本上,读到文件的末尾,睡眠一段时间,fseek()(不改变你的位置)清除eof,再次读取到文件结尾。洗,冲洗,重复。 man fseek(3)了解详情。

这是perl中的样子。 perl的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

答案 1 :(得分:0)

See here

您可以调用tail并将流检索回应用程序,或者因为它是开源的,也可以尝试将其拉入您自己的代码中。

此外,在C ++ iostream中可以打开一个文件仅供查看,只读到最后,同时缓冲最后10-20行,然后输出。

答案 2 :(得分:0)

我认为你要找的是c / c ++中的select()调用。我在这里找到了一个手册页的副本:http://www.opengroup.org/onlinepubs/007908775/xsh/select.html。选择将文件描述符作为参数,并告诉您何时其中一个已更改并准备好阅读。

答案 3 :(得分:0)

尾部程序是开源的,所以你可以参考它。我想知道同样的事情,不久前看了一下代码,认为这很简单,但我对它的复杂程度感到惊讶。有许多问题需要考虑在内。