【问题标题】:Linux: How do I find out if a file has been updated by another process?Linux:如何确定文件是否已被另一个进程更新?
【发布时间】:2009-07-03 06:02:09
【问题描述】:

我目前正在查看来自 log4j 输出的 XML 文件。我有一个自定义查看器,可以在 GUI 中显示日志输出。我需要观察这个文件何时更新,以便 GUI 可以重新解析和更新自身。在 C# 中有一个 FileWatcher 概念,所以在 Windows 上没有问题,但是我在 Linux 上使用 C 有什么选择。

在 unix 和 linux 风格(可能是 POSIX)上是否有执行此操作的标准方法?

谢谢

【问题讨论】:

    标签: c linux file


    【解决方案1】:

    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 采取更基本的方法并自行检查。

    【讨论】:

    • 我怀疑 poll() 会有所帮助。听起来您误解了 poll() 的作用。除非您打算将它 inotify 一起使用。
    • 澄清一下:poll() 只能告诉你“如果我现在从这个文件中读取(),会阻塞吗?”或“等待最多 3 秒或直到我可以从这些文件描述符中的至少一个中读取(没有 read() 阻塞)”。
    【解决方案2】:

    你在寻找类似inotify 的东西吗?

    您也可以使用stat 轮询文件。

    【讨论】:

    • 这完美地满足了我的需求,但我认为我将不得不重新发明轮子并使用标准 C API 对其进行编码。那么我有没有机会使用简单的 fstat 和 stat API 来做到这一点?
    • 你可能想澄清一下......如果 inotify 听起来像你需要的,而且你在 Linux 上,为什么不能直接使用它?
    【解决方案3】:

    如果您想要比 Linux 主义的 inotify 更便携的东西,请查看 File Alteration Monitor,它是较旧且更便携的技术,但性能可能较差。另一方面,它对挂载 NFS 的文件系统有一些帮助,这取决于您的应用程序可能很重要。

    【讨论】:

    • 感谢您的建议,特别是因为它与内核无关并且可能适用于 NFS 安装系统。
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 2010-12-29
    • 2011-08-31
    • 2017-09-17
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多