编辑:我最后使用了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()代替提供的解决方案是一个好主意吗?。
提前致谢。
答案 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)