如何编写类似 C 程序的 tail -f

How to write a tail -f like C program

我想在 Linux(Ubuntu 发行版)中实现一个模仿 tail -f 的 C 程序。请注意,我不想从我的 C 代码中实际调用 tail -f,而是实现它的行为。目前我能想到两种实现方式

  1. 调用程序时,我查找到文件末尾。之后,我会定期读到文件末尾,如果它不为空,则打印我读到的任何内容。
  2. 第二种可能更有效的方法是再次查找文件末尾。但是,这次我 "somehow" 侦听对该文件的更改并读取到文件末尾,只有当我更改它时。

话虽如此,我的问题是如何实施第二种方法,以及是否有人可以分享是否值得付出努力。另外,只有这两个选项吗?

注意:感谢您的评论,问题已根据它们进行更改。

您可以通过以下步骤实现需求: 1) fopen 'a+' 模式; 2) select 文件描述符打开(需要从 FILE * 转换为文件描述符)并进行读取。

没有用于监视文件更改的标准化机制,因此您无论如何都需要实施 "polling" 解决方案(即,当您到达文件末尾时,等待一小段时间然后重试。)

在 Linux 上,您可以使用 inotify 系列系统调用,但请注意它并不总是有效。它不适用于特殊文件或远程文件系统,例如,它可能不适用于某些本地文件系统。在符号链接的情况下很复杂。等等。有一个 Windows 等效项,但我相信它也存在一些相同的问题。

因此,即使您使用通知系统,您也需要轮询解决方案作为备份,并且由于 OS 通知不能保证可靠(也就是说,如果系统负载不足,通知可能会被丢弃),即使您使用的是通知系统,您也需要轮询超时。

您可能想查看 GNU tail 实用程序 (http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c) 的实现,以了解如何处理特殊情况。