以编程方式在纯C中实现tail -f

时间:2015-03-28 18:55:54

标签: c solaris tail

我正在尝试在纯C中实现一个解决方案,以监控对日志文件所做的新条目,这些条目会向Web服务记录大量请求。

我想像tail -f这样的东西,日志文件中的更改会导致我的进程立即获得新的更改。

不幸的是,这需要在Solaris 10上运行。

我知道这个问题已在其他主题中被提及并回答,但我的情况无法接受任何解决方案

1)解决方案不得以任何方式要求超级用户访问。由于这是一个企业生产环境,因此我无法在此系统上访问超级用户,因此我无法执行安装驱动程序等操作。

2)日志文件非常大。完全解析它,反复进行新的改变是不可接受的。

在我看来,如果我可以将tail -f作为非特权用户运行,我应该能够以编程方式执行相同的用户。我意识到一个不错的黑客就是将tail -f的输出传输到我的进程中,尽管我想要更清洁。

1 个答案:

答案 0 :(得分:2)

这非常简单 - 只需读取,如果您读取零字节,请等待指定的时间。仅用于说明(打开您自己的文件并改进缓冲区和错误处理)。我编辑了这个以显示错误处理和寻找最后一行的位置,并修复了sleep()的位置。这绝不是一个完整的例子,只是表明事情是如何完成的。

#include <unistd.h>
#include <stdio.h>

#define NBUF 1024
int main()
{
  char buf[NBUF];
  ssize_t rcount, wcount;

  int fin = 0, fout = 1;  /* Or use open.  */
  /* Code to display the last 10 lines goes here.  */
  while (1)
    {
      while ((rcount = read (fin, buf, NBUF)) > 0)
    {
      wcount = write (fout, buf, rcount);
      if (wcount != rcount)
        {
          perror("write didn't work.");
          /* Handle error here, exit() or whatever.  */
        }
    }
      if (rcount == -1)
        {
           perror("Read didn_t work...");
           /* Handle error here, exit() or something else.  */
      sleep (1);
    }
}