Linux:如何确定文件是否已被另一个进程更新?

6
我目前正在监视log4j输出的XML文件。我有一个自定义的查看器,可以在GUI中显示日志输出。我需要监视此文件,以便在更新时GUI可以重新解析和更新自身。在Windows中,C#有FileWatcher概念,所以没有问题,但是在Linux上使用C有哪些选择呢?
是否有一种标准方法可用于unix和linux版本(可能是POSIX)?
谢谢。
3个回答

6

你是否在寻找类似 inotify 的东西?

或者你可以使用 stat 轮询文件。


那完全符合我的需求,但我认为我必须重新发明轮子并使用标准的C API对其进行编码。那么是否有可能使用简单的fstat和stat API来完成它? - Jason Bourne
你可能想澄清一下... 如果inotify听起来像是你需要的,并且你正在使用Linux,为什么不能直接使用它呢? - unwind

6

约翰提到了在Unix/Linux系统下观看文件的两种主要方法:通知和轮询。

通知是指系统本身(通常是内核)在文件被访问或写入时向注册应用程序触发消息。这种方法需要一个兼容的系统,可能在较旧的机器上不可用。

Linux下通知的主要实现是inotify,它内置于2.6.13及更高版本的内核中,并可以打补丁到2.6.12及更早的版本中。有一个很好的IBM指南介绍如何使用inotify,以及一个基本的工具和C库集合来访问inotify。

轮询是指您的程序以间隔重复检查文件,以查看该文件的任何内容 - 其大小、最后修改时间、所有者等是否已更改。

由于它是在程序级别而不是系统级别编写的,因此没有标准实现,尽管存在系统调用poll,并且似乎对此有用(手册页面称其类似于select,它等待文件描述符上的事件变得可用)。您还可以采用更基本的方法stat,自行进行检查。


我怀疑 poll() 不会有帮助。听起来你误解了 poll() 的作用。除非你是想与 inotify 一起使用它。 - Thomas
澄清一下:poll() 只能告诉你这样的信息:“如果我现在从这个文件 read(),会阻塞吗?”或者“等待最多 3 秒,或者直到我可以从这些文件描述符中的至少一个读取(而不会被 read() 阻塞)”。 - Thomas

0

如果你想要比inotify更加便携的东西,那么可以考虑使用文件变更监视器,它是一种更古老、更便携的技术,但可能性能较差。另一方面,它可以在NFS挂载的文件系统上执行有用的操作,这对于你的应用程序可能很重要。


感谢您的建议,特别是它与内核无关,并且可能适用于NFS挂载系统。 - Jason Bourne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接