我有一个线程在 Mac OS X 上监视文件系统事件。如果我将 100 个文件复制到正在监视的文件夹中,我显然会收到多个文件系统事件,因此会收到多个回调调用。我想知道这些回调调用是否一个接一个地处理?还是每个事件都调用一个 OS 线程,该线程又调用回调函数,在这种情况下,我们将有多个线程,每个线程都执行相同的回调函数?
问问题
224 次
1 回答
1
这取决于您使用哪种机制来监视文件系统事件。
对文件的每次访问都会在内核中生成一个通知。
如果您使用公共FSEvents API,过于频繁的更新会合并为单个通知。这种情况下,接收端由运行循环管理,即回调不在新的后台线程中调用,也不在操作系统线程的上下文中调用。它在您指定的事件循环中运行,通常是运行主事件处理循环的主线程。
如果您直接进入/dev/fsevents
(参见例如OS X book),您将一一获取调用线程中的所有事件,一次调用可能返回多个事件。
类似地,如果您改为使用 BSD-derived ,如果事件频繁kqueue
,您将通过调用 获得多个事件。kqueue
在任何情况下,操作系统都不会在新/操作系统线程中运行您的回调,也不会神奇地复制您的线程来监视文件系统活动,以便它们可以同时处理事件。
于 2010-09-24T23:07:15.703 回答