【问题标题】:Monitoring files asynchronously异步监控文件
【发布时间】:2012-02-24 23:04:28
【问题描述】:

在 Unix 上:我经历过 FAMGamin,它们似乎都提供了客户端/服务器文件监控系统。我宁愿有一个系统,我告诉内核监视一些 inode,当事件发生时它会提醒我。 Inotify 起初看起来很有希望:inotify_init1 让我通过 IN_NONBLOCK 这反过来又导致 poll() 直接返回。但是我知道,如果我想了解有关受监视文件的消息,我必须定期调用它。现在我有点缺乏想法。

有什么东西可以异步监控文件吗?

PS:我还没有看过 Windows,但我也很想知道一些关于它的答案。

【问题讨论】:

  • inotify 正是您正在寻找的。如果您在 poll() 请求中包含 inotify 文件描述,它将在有可读取的 inotify 事件时返回。与poll() 一样,只要您询问的文件描述符都没有准备好并且超时没有过期,它就会阻塞。那么问题出在哪里?
  • 好吧,阻塞poll() 调用并不完全是我所说的异步,恰恰相反:)
  • 当有 inotify 事件(或套接字上可用的数据,或任何其他类型的事件)时,您希望如何获得通知?如果您的软件是围绕等待事件并对其进行操作而构建的,那么您已经拥有某种调用poll() 或类似名称的事件循环。如果您想在等待事件进入时运行其他代码,那么您可能需要在单独的线程中执行此操作,在这种情况下,您的主线程将仍然使用事件循环,或者您甚至不需要非阻塞IO,你可以有一个线程阻塞inotifyread()
  • 当有 inotify 事件时你希望如何得到通知:我希望内核发送一个信号。我实际上正在开发一个名为 xnot 的库,因此不存在主要结构。但是让我们假设它有一个事件循环:在这种情况下,我无法通过调用 poll() 来阻止它。相反,为此专门设置一个线程是我想避免的,因为它很昂贵。
  • 你不会阻塞它的事件循环,你会与它集成,以便它等待你的 inotify 文件描述符以及它碰巧等待的所有其他事情。像 glib 这样的事件循环框架提供了一种挂钩方式。但无论如何,你在谈论信号。你的意思是像POSIX信号?像aio_read()这样的函数所使用的?好吧,您可以在inotify fd 上尝试aio_read()。它可能会起作用。我不知道,但我不会推荐它。使用库中的信号通常不是一个好主意,因为它可能会干扰应用程序对它们的使用。

标签: windows unix asynchronous filesystems monitoring


【解决方案1】:

正如 Celada 在上面的 cmets 中所说,inotify 和 poll 是执行此操作的正确方法。

信号不是一种合理的异步编程机制——信号处理程序对于没有经验的人甚至对于有经验的人来说都是非常危险的。人们不会自愿将它们用于此类目的。

相反,应该使用 poll、select 或一些类似的系统调用作为程序事件处理机制的核心,围绕事件循环构建程序(请参阅http://en.wikipedia.org/wiki/Event-driven_programming 以获得整体解释)。

或者,您可以使用线程,或线程加上事件循环。

【讨论】:

    【解决方案2】:

    无论你的回答多么有趣,很抱歉,当问题状态为“异步”时,我不能接受基于阻塞调用 poll 或 select 的机制,无论它隐藏多深。

    另一方面,我发现可以通过将标志 IN_NONBLOCK 传递给 inotify_init1 来设法异步运行 inotify。信号不会像aio 那样被触发,而阻止阻塞的read 调用会将errno 设置为EWOULDBLOCK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多