实施日志观察器
时间:2020-03-05 18:42:01 来源:igfitidea点击:
我想知道如何在C / C ++中实现类似于tail -f
的程序,该程序监视并处理添加到日志文件中的新行?
解决方案
回答
看这里
我们可以呼唤尾巴,然后将流检索回应用程序,或者作为流的开源,也许尝试将其拉入我们自己的代码中。
另外,在C ++ iostream中,可以打开一个文件以供查看,而只是读取到最后,同时缓冲最后10到20行,然后将其输出。
回答
我们可以使用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程序是开源的,因此我们可以参考它。我想知道同样的事情,不久前又看了一下代码,以为这很简单,但是我惊讶它是如此的复杂。有很多陷阱必须考虑在内。