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

问题描述 投票:0回答:1

[我正在尝试用纯C语言实现一个解决方案,以监视对记录向Web服务的大量请求的日志文件进行的新条目。

我想要tail -f之类的东西,其中日志文件中的更改导致我的过程立即获得新更改。

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

[我知道这个问题已经在其他线程中提出并回答过,但是我的情况都不能接受任何解决方案

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

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

在我看来,如果我可以以非特权用户身份运行tail -f,则我应该能够以编程方式与同一用户进行相同的操作。我意识到一个不错的技巧是将tail -f的输出通过管道传递到我的进程中,尽管我想要更干净的东西。

c solaris tail
1个回答
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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.