【问题标题】:Implementing a log watcher实现日志观察器
【发布时间】:2010-09-06 13:09:01
【问题描述】:

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

【问题讨论】:

    标签: c++ c file io


    【解决方案1】:

    See here

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-31
            • 2015-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-01
            • 1970-01-01
            相关资源
            最近更新 更多