【发布时间】:2012-02-24 23:04:28
【问题描述】:
在 Unix 上:我经历过 FAM 和 Gamin,它们似乎都提供了客户端/服务器文件监控系统。我宁愿有一个系统,我告诉内核监视一些 inode,当事件发生时它会提醒我。 Inotify 起初看起来很有希望:inotify_init1 让我通过 IN_NONBLOCK 这反过来又导致 poll() 直接返回。但是我知道,如果我想了解有关受监视文件的消息,我必须定期调用它。现在我有点缺乏想法。
有什么东西可以异步监控文件吗?
PS:我还没有看过 Windows,但我也很想知道一些关于它的答案。
【问题讨论】:
-
inotify正是您正在寻找的。如果您在poll()请求中包含 inotify 文件描述,它将在有可读取的 inotify 事件时返回。与poll()一样,只要您询问的文件描述符都没有准备好并且超时没有过期,它就会阻塞。那么问题出在哪里? -
好吧,阻塞
poll()调用并不完全是我所说的异步,恰恰相反:) -
当有 inotify 事件(或套接字上可用的数据,或任何其他类型的事件)时,您希望如何获得通知?如果您的软件是围绕等待事件并对其进行操作而构建的,那么您已经拥有某种调用
poll()或类似名称的事件循环。如果您想在等待事件进入时运行其他代码,那么您可能需要在单独的线程中执行此操作,在这种情况下,您的主线程将仍然使用事件循环,或者您甚至不需要非阻塞IO,你可以有一个线程阻塞inotify的read()。 -
当有 inotify 事件时你希望如何得到通知:我希望内核发送一个信号。我实际上正在开发一个名为 xnot 的库,因此不存在主要结构。但是让我们假设它有一个事件循环:在这种情况下,我无法通过调用
poll()来阻止它。相反,为此专门设置一个线程是我想避免的,因为它很昂贵。 -
你不会阻塞它的事件循环,你会与它集成,以便它等待你的 inotify 文件描述符以及它碰巧等待的所有其他事情。像 glib 这样的事件循环框架提供了一种挂钩方式。但无论如何,你在谈论信号。你的意思是像POSIX信号?像
aio_read()这样的函数所使用的?好吧,您可以在inotifyfd 上尝试aio_read()。它可能会起作用。我不知道,但我不会推荐它。使用库中的信号通常不是一个好主意,因为它可能会干扰应用程序对它们的使用。
标签: windows unix asynchronous filesystems monitoring