2008-08-22 74 views
3

我在想如何在C/C++中实现类似于tail -f的程序,该程序监视并处理添加到日志文件中的新行?实现日志观察器

回答

5

您可以使用fseek()来清除流上的eof条件。实质上,读到文件末尾,睡一会儿,fseek()(不改变你的位置)清除eof,再次读到文件结尾。洗涤,冲洗,重复。男子fseek(3)的细节。

下面是它在perl中的样子。 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 
0

See here

你既可以调出尾和检索流回到您的应用程序,或者它是开源的,也许尝试把它拉入自己的代码。

另外,C++ iostream有可能打开一个文件只能查看,只读到最后,缓存最后10-20行,然后输出。

0

尾巴程序是开源的,所以你可以引用它。我想知道同样的事情,并回头看了一下代码,认为这很简单,但我对它的复杂程度感到惊讶。有很多必须考虑的陷阱。