如何在 OS X 上获取正在读取文件的通知?

Posted

技术标签:

【中文标题】如何在 OS X 上获取正在读取文件的通知?【英文标题】:How can I get notifications that a file is being read on OS X? 【发布时间】:2015-11-05 11:26:16 【问题描述】:

我有一个可以在 Windows 上运行的软件。该软件有两个组件:在内核模式下工作的文件系统微过滤驱动程序和与驱动程序对话的用户模式组件。 Driver 接收 IO 中断请求的通知,例如IRP_MJ_READ。可以在github 上找到执行此操作的示例应用程序。这适用于 Windows 支持的任何用户和大多数文件系统。

我需要为 OS X(仅限桌面和服务器)开发类似的软件。我看过的东西:

FSEvent Kernel Queues 系统调用表API挂钩/劫持 kprobe fanotify

我的保留意见是:FSEvents 的性能可能不是很好,因为我需要监视根 / 文件夹和任何已安装的设备。我对内核队列和系统调用 API 劫持的理解非常有限,这可能会使移植到不同的 OS X 版本变得非常困难,并可能导致与 AV 或 OS 保护发生冲突(例如 PaX 强化)。

问题:我如何获得通知,告知 OS X 上的任何用户正在读取根 / 中任何(递归)文件夹中的文件?

【问题讨论】:

另一个问题:您打算将您的应用程序放入沙盒中还是在 Mac 应用商店上可用? 不确定,有什么更容易的,有什么能让我这样做的。我认为 AV 可以通过商店获得,而沙盒可能不允许我做我需要做的事情。 【参考方案1】:

通过内核扩展,Kernel Authorization 提供了File Operation Scope,允许您监控所有 vnode 的 KAUTH_FILEOP_OPENaction。

KAUTH_FILEOP_OPENaction 将在访问所有文件之前被调用,从而允许您监控文件访问。

如果您想要更精细的操作,VNode scope 提供了更大的操作集,包括 KAUTH_VNODE_READ_DATA,但请注意,此范围可能非常嘈杂,随时会触发大量操作。

可以在 Singh 的Mac OS X Internals 中找到此类内核扩展的示例代码

【讨论】:

【参考方案2】:

FSEvents 的性能没有问题;如果您使用 Spotlight 和/或 Time Machine,它已经在您的系统上运行。如果有更有效的方法从头开始重新实现它,我会感到非常惊讶。因此,如果它在其他方面都满足您的要求,我会同意的。

【讨论】:

FSEvents 没有为我提供进程 ID(或进程名称)和用户安全标识符(或用户名)。我关注的示例是:Bob 在上午 7:50 使用应用程序bananareader.jar 读取 /tmp/banana 中的文件。我认为 FS 事件只能为我提供 /tmp/banana 文件在 7:50 读取。

以上是关于如何在 OS X 上获取正在读取文件的通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取目录下的文件数(一行Python)

如何在 OS X 上获取可移动卷的 NSURL 并在安装时发出通知?

在 OS X 上打开 NSImage 时从 EXIF 读取相机数据

允许在 Mac OS X 应用程序中读取文件的权利是啥? (拒绝文件读取数据错误)

在 OS X 上读取 Jar 的清单

OS X:如何使用 NSRunLoop 观察套接字读取事件?