任何操作系统的关键功能都是响应本地文件系统上的事件,特别是更改、添加和删除。此类事件可能需要自动操作,例如索引、注册或通知特定应用程序。
BSD kevent(2)机制(在第8章中讨论)可以使用EVFILT vnode监视vnode(=文件和目录)事件。这类似于Linuxs inotify功能。尽管事件仅限于单个vnode,但是,在Macos 10.5(和IOS 5.0)中引入的Fsevents机制提供了更有用的文件系统范围的通知这一机制被Apple广泛用于监视和响应文件系统中的更改,尤其是在launchd的com中。
限制 /dev/fsevents
只能有 root 用户使用。
FSEvents.framework
可以很容易的将 FSEventStream 对象插入到 CFRunLoop 中,这使得应用程序可以很容易地将文件系统事件监视为另一个 CFRunLoopSource
这个框架使用了 fseventsd ,但是守护进程的报告事件中,不包含参与者的详细信息
在 FSEvents.framework 框架中,对应操作没有在字符设备上,而是将 Mach 消息发送到一个专用的守护程序 fseventsd。
fseventsd 守护进程 声明 com.apple.FSEvents
的 Mach 端口。
当用 SIGUSR1 发送信号时,可以是守护进程转存其内部状态。通过 syslog 或 跟新 os 日志
fseventsd 还负责在每个 mounted vlume 中创建 .fseventsd 目录。
fseventsd还负责。它在每个装入卷的根目录中创建fseventsd目录(在IOS中,在/var/.fseventsd中,因为根文件系统是只读装入的)。它的文件包括卷的fsevents-uuid,以及名称为16个十六进制数字序列的各种文件。检查这些文件会发现它们是gzip文件,包含所有历史fsevents事务数据。通过创建 fseventsd/no_log 可以禁用这些文件的创建