Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 异步监视文件_Windows_Unix_Asynchronous_Filesystems_Monitoring - Fatal编程技术网

Windows 异步监视文件

Windows 异步监视文件,windows,unix,asynchronous,filesystems,monitoring,Windows,Unix,Asynchronous,Filesystems,Monitoring,在Unix上:我经历了FAM和Gamin,它们似乎都提供了客户机/服务器文件监视系统。我更希望有一个系统,在这个系统中,我告诉内核监视一些inode,它会在事件发生时戳回我Inotify起初在这方面看起来很有希望:Inotify\u init1让我在非块中通过,这反过来又导致poll()直接返回。然而,我明白,如果我想知道有关被监控文件的消息,我必须定期给它打电话。现在我有点缺乏想法 有什么东西可以异步监视文件吗 PS:我还没有看过Windows,但我也很想得到一些关于它的答案。正如塞拉达在上面

在Unix上:我经历了
FAM
Gamin
,它们似乎都提供了客户机/服务器文件监视系统。我更希望有一个系统,在这个系统中,我告诉内核监视一些inode,它会在事件发生时戳回我
Inotify
起初在这方面看起来很有希望:
Inotify\u init1
让我在非块中通过
,这反过来又导致
poll()
直接返回。然而,我明白,如果我想知道有关被监控文件的消息,我必须定期给它打电话。现在我有点缺乏想法

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


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

正如塞拉达在上面的评论中所说,inotify和poll是正确的方法

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

相反,应该使用poll、select或类似的系统调用作为程序事件处理机制的核心,围绕事件循环构建程序(请参阅,以获取总体解释)


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

无论您的答案多么有趣,很抱歉,当问题表示“异步”时,我不能接受基于轮询或选择阻塞调用的机制,无论隐藏的深度如何


另一方面,我发现可以通过将非块中的标志
传递到
inotify\u init1
来异步运行inotify。信号不会像使用
aio
那样被触发,而阻塞阻塞的
read
调用会将
errno
设置为
ewoldblock

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