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

有帮助吗?

解决方案

您可以使用 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

其他提示

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

tail 程序是开源的,所以你可以参考它。我也想知道同样的事情,并且不久前查看了代码,认为它会非常简单,但我对它的复杂程度感到惊讶。有很多问题需要考虑。

看这里

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top