我想知道如何实现一个类似于tail -f
C/C++ 的程序,一个监视和处理添加到日志文件的新行的程序?
grom
问问题
836 次
4 回答
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
于 2008-08-22T13:46:16.093 回答
0
您可以调用 tail 并将流检索回您的应用程序,或者因为它是开源的,所以可以尝试将其拉入您自己的代码中。
此外,可以在 C++ iostream 中打开一个文件供查看,然后只读取到最后,同时缓冲最后 10-20 行,然后输出。
于 2008-08-22T13:41:22.017 回答
0
我认为您正在寻找的是 c/c++ 中的 select() 调用。我在这里找到了手册页的副本:http ://www.opengroup.org/onlinepubs/007908775/xsh/select.html 。Select 将文件描述符作为参数,并在其中一个已更改并准备好读取时告诉您。
于 2008-08-22T13:47:39.880 回答
0
tail 程序是开源的,所以你可以参考它。我想知道同样的事情,并在不久前查看了代码,认为它会很简单,但我对它的复杂程度感到惊讶。有很多陷阱需要考虑。
于 2008-08-22T14:04:49.637 回答