使用python,我有一个守护进程按以下方式查看日志文件:
f = open(r'logfile.log', 'r')
while True:
line = f.readline()
if not line:
time.sleep(1)
else:
# do something
问题是,如果用C语言写的话,'做某事'部分会更快地执行。所以,我想在C中做同样的事情。如何用C语言编写一个跟踪日志文件的类似方法?
以下内容只是抓取整个文件,并对每行进行“处理”。相反,我只想在日志文件中附加新行“做某事”:)
FILE *fr;
char line[100];
fr = fopen ("logfile.log", "rt");
while(fgets(line, 100, fr) != NULL){
//do something
}
fclose(fr);
谢谢!
答案 0 :(得分:1)
您可以使用fseek
功能跳转到文件中的特定偏移量。为了避免跳过Python代码检测到的新行,python中的部分应该将搜索偏移量传递给C代码。 (最好的方法取决于你如何调用C代码..)
long seek_offset = /* get offset from Python side */
fseek(fr, seek_offset, SEEK_SET);
答案 1 :(得分:1)
您可以尝试以下代码:
#include <stdio.h>
int main()
{
mkfifo("tmpFifo");
if(fork()==0)//to avoid the main program getting stuck at system()..
{
system("tail -f logfile.txt > tmpFifo");
exit(0);
}
int fd = open("tmpFifo", O_RDONLY);
char buff[1000];//set some length depending on the maximum string that gets
//appended...
int n;
while((n=read(fd, buff, 1000))>0)
{
//do something... where 'n' stores the number of chars read...
}
close(fd);
rm("tmpFifo");
return 0;
}
如果您想编写代码而不是使用tail -f
,this可能会有所帮助。但是,我想这是最简单的解决方案。
答案 2 :(得分:1)
我最初回答:“在类似POSIX的系统上,您可以使用select()
”观察“打开的文件描述符,看看是否有更多输入可用。这可能是在任何Unix / Linux系统上执行此操作的规范方式。“,但是I was wrong。
我在套接字和管道上使用过select()
并假设只有在有更多可用数据的情况下它才会返回,但这虽然可能是肤浅的直觉,但事实并非如此:select()
被定义为在后续read()
(或write()
)不会阻止时返回,这是另一回事,因为read()
有可能读取零字节而不是阻止。
普通文件总是read()
- 即使在文件结束时也是如此。如果您尝试使用select()
拖尾日志文件,select()
永远不会阻止,后续read()
是零长度。简而言之,你最终会忙着等待。阅读任何tail
实施的源代码或阅读surrounding discussion将证实这一点。
我想我应该把它放在这里,以防其他人犯同样的错误。