【发布时间】:2009-07-03 06:02:09
【问题描述】:
我目前正在查看来自 log4j 输出的 XML 文件。我有一个自定义查看器,可以在 GUI 中显示日志输出。我需要观察这个文件何时更新,以便 GUI 可以重新解析和更新自身。在 C# 中有一个 FileWatcher 概念,所以在 Windows 上没有问题,但是我在 Linux 上使用 C 有什么选择。
在 unix 和 linux 风格(可能是 POSIX)上是否有执行此操作的标准方法?
谢谢
【问题讨论】:
我目前正在查看来自 log4j 输出的 XML 文件。我有一个自定义查看器,可以在 GUI 中显示日志输出。我需要观察这个文件何时更新,以便 GUI 可以重新解析和更新自身。在 C# 中有一个 FileWatcher 概念,所以在 Windows 上没有问题,但是我在 Linux 上使用 C 有什么选择。
在 unix 和 linux 风格(可能是 POSIX)上是否有执行此操作的标准方法?
谢谢
【问题讨论】:
John 提到了在 Unix/Linux 系统下查看文件可以采取的两种主要途径:通知和轮询。
通知是当系统本身(通常是内核)在文件被访问或写入时向已注册的应用程序触发消息。这种方法需要一个兼容的系统,并且可能不适用于旧机器。
Linux 下通知的主要实现是inotify,它内置于 2.6.13 及更高版本的内核中,可以修补到 2.6.12 及更早版本。有一个 nice IBM guide 用于使用 inotify 以及一个基本的 set of tools and C library 用于访问 inotify。
轮询是指您的程序每隔一段时间重复检查一个文件,以查看该文件的任何内容(其大小、上次修改时间、所有者等)是否已更改。
没有标准的实现,因为它是在程序级而不是系统级的基础上编写的,尽管系统调用poll 存在并且似乎为此做了一些有用的事情(手册页说它类似于select,它等待一个事件在文件描述符上可用)。您也可以使用stat 采取更基本的方法并自行检查。
【讨论】:
如果您想要比 Linux 主义的 inotify 更便携的东西,请查看 File Alteration Monitor,它是较旧且更便携的技术,但性能可能较差。另一方面,它对挂载 NFS 的文件系统有一些帮助,这取决于您的应用程序可能很重要。
【讨论】: