gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:28:46 25 4
gpt4 key购买 nike

我正在尝试用纯 C 实现一个解决方案,以监视对日志文件所做的新条目,该日志文件记录了对 Web 服务的大量请求。

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

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

我知道这个问题已在其他线程中提出和回答,但没有一种解决方案适合我的情况

1) 解决方案不得以任何方式要求 super 用户访问权限。由于这是一个企业生产环境,我在这个系统上没有 super 用户访问权限,所以我不能做安装驱动程序之类的事情。

2) 日志文件会很大。完全解析它,重复进行新的更改是 Not Acceptable 。

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

最佳答案

这个很直接——直接读,如果读到零字节,就等待指定的时间。仅供说明(打开您自己的文件并根据口味改进缓冲区和错误处理)。我对此进行了编辑以显示错误处理和寻找最后几行应该发生的位置,并修复了 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);
}
}

关于c - 在纯 C 中以编程方式实现 tail -f,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29321248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com