在C中查看日志文件

时间:2013-09-18 15:19:31

标签: python c file loops logfile

使用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);

谢谢!

3 个答案:

答案 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 -fthis可能会有所帮助。但是,我想这是最简单的解决方案。

答案 2 :(得分:1)

我最初回答:“在类似POSIX的系统上,您可以使用select()”观察“打开的文件描述符,看看是否有更多输入可用。这可能是在任何Unix / Linux系统上执行此操作的规范方式。“,但是I was wrong

我在套接字和管道上使用过select()并假设只有在有更多可用数据的情况下它才会返回,但这虽然可能是肤浅的直觉,但事实并非如此:select()被定义为在后续read()(或write()不会阻止时返回,这是另一回事,因为read()有可能读取零字节而不是阻止。

普通文件总是read() - 即使在文件结束时也是如此。如果您尝试使用select()拖尾日志文件,select()永远不会阻止,后续read()是零长度。简而言之,你最终会忙着等待。阅读任何tail实施的源代码或阅读surrounding discussion将证实这一点。

我想我应该把它放在这里,以防其他人犯同样的错误。