在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选项。
所以,你可以做同样的事情:
- 使用stat()读取文件的inode编号
- 显示该文件的内容。 存储文件描述符的位置,例如,p = ftell(fd)
- 再次使用stat(),并查看inode是否已更改。 如果是,则从位置p开始显示文件的内容
- 重复