在C中自定义实现“tail -f”功能

时间:2009-05-19 16:27:08

标签: python c

编辑:我最后使用了inotify。正如stefanB所说,inotify是可以使用的东西。我找到了一个尾部克隆,它使用inotify来实现-f模式,inotail

原始问题文字:

我正在尝试在C项目中实现“tail -f”逻辑,为了进行原型设计,我在python中开发了它,如下所示:


    # A forever loop, each 5 seconds writes a line into file.txt
    from time import *

    while 1:
        sleep(5)
        file = open("file.txt", "a")
        file.write("This is a test\n")
        file.close()

下一个代码遵循file.txt的eof(由上面的代码更新)


    # tail -f 
    from time import *

    file = open("file.txt", "r")
    file.seek(0, 2)

    while 1:
      line = file.readline()
      if not line:
          sleep(1)
      else:
          print line

    file.close()

一切正常,但C实现不起作用(没有检查错误代码)。省略了stdio.h,string.h和unistd.h的包含(着色隐藏了头包含代码)。


    #define LINE_LEN 256

    int main(int argc, char **argv)
    {
        FILE *f;
        char line[LINE_LEN];

        f = fopen("file.txt", "r");

        fseek(f, 0, SEEK_END);

        while (1)
        {
            fgets(line, LINE_LEN, f);

            if (strlen(line) == 0)
            {
                sleep(1);
            }
            else
            {
                printf("Readed: %s", line);
            } 
        }

        fclose(f);

        return 0;
    }

有些想法?

使用poll()代替提供的解决方案是一个好主意吗?。

提前致谢。

3 个答案:

答案 0 :(得分:3)

一旦FILE *看到错误或eof,它就会设置其内部状态,以便在后续调用中继续返回错误或eof。您需要在睡眠返回后调用clearerr(f);以清除eof设置并让它尝试从文件中读取更多数据。

答案 1 :(得分:3)

修改: 似乎inotify似乎是使用的东西。它应该从2.6.13开始包含在linux内核中。 An article from IBM developerworks about inotify

上一个回答:

看看Linux File Alteration Monitor(在Linux内核2.4.x>中)。这是一个框架,让您订阅文件更改,并在发生更改时从内核获得回调。这应该比民意调查更好。

Examples如何轮询文件更改,查看等待文件更改轮询文件更改部分。

我还没有尝试过。

答案 2 :(得分:2)

来自tail man page

  

-f在达到文件结束时不要停止,而是等待   要附加到的附加数据   输入。如果文件被替换(即,   inode数量改变),尾巴会   重新打开文件并继续。如果   文件被截断,尾部将重置它   位置到开头。这使得   尾巴对于观看日志更有用   可能会被轮换的文件。 -f   如果标准,则忽略选项   输入是管道,但如果是管道则不是   FIFO。

所以,你可以做同样的事情:

  1. 使用stat()读取文件的inode编号
  2. 显示该文件的内容。存储文件描述符的位置,例如,p = ftell(fd)
  3. 再次使用stat(),查看inode是否已更改。如果是,则从位置p向前显示文件的内容
  4. 重复