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

编辑:我最后使用了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()代替提出的解决方案实现它是一个好主意吗?

提前致谢。

编辑 :似乎inotify是使用的东西。 它应该从2.6.13开始包含在linux内核中。 IBM developerworks上有关inotify的文章 。

上一个答案:

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

示例如何轮询文件更改,查看部分等待文件更改轮询文件更改

我还没有尝试过。

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

tail 手册页 :

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

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

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