【问题标题】:How to get notified if a file is opened如何在文件打开时收到通知
【发布时间】:2018-08-24 16:43:21
【问题描述】:

所以如果我有一个目录/dir,它可以包含任意数量的文件N,并且这些文件可以在/dir 的任何子目录中。如何查看/dir 以便在dir 或其任何子目录中的文件打开时收到通知?我不想查看所有文件并检查是否为该文件获取了锁。

我查看了 FSEvents,但我很确定我不能这样做。

适用于 macOS 操作系统

所以任何人都可以指出我正确的方向或知道解决方案

【问题讨论】:

    标签: swift macos filesystems


    【解决方案1】:

    一种方法是编写内核扩展并使用 Apple 的 Kernel Authorisation (KAuth) 框架。

    然后您将订阅 File Operation scope 和 KAUTH_FILEOP_OPEN 操作。

    这还需要用户级应用程序与内核扩展通信,以接收文件操作通知,因此此方法将取决于您查看文件的要求,以确定这是否只是矫枉过正。

    【讨论】:

      【解决方案2】:

      您可以使用kqueue,根据您想要监控的事件,您可以获得“通知”,例如,您可以使用EVFILT_VNODE 过滤器:

      EVFILT_VNODE Takes a file descriptor as the identifier and the
                   events to watch for in fflags, and returns when one
                   or more of the requested events occurs on the
                   descriptor.  
      

      要获取您可以监控的所有事件的列表,请查看以下人员:https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2(包括 macOS 在内的所有 BSD 中的实现都非常相似),请查看此答案以查看一些差异:https://stackoverflow.com/a/49521218/1135424

      【讨论】:

      • 我可能是错的,但我不需要为所有文件和目录添加一个观察者吗?
      • @LarsNielsen "是的" 你需要实现一些东西来等待一个事件,希望这行代码能给你一个想法github.com/immortal/immortal/blob/master/kqueue.go#L9-L47 它检查目录中的任何更改,还检查检查文件更改时的标志:github.com/immortal/immortal/blob/master/kqueue.go#L66
      • kqueue 确实非常轻巧,并且比其他进行轮询的解决方案要好得多,而且 iOS 似乎也支持sleep
      • 我遇到了与 OP 类似的问题,但不幸的是 kqueue 对我们俩都没有帮助。 macOS 似乎不会使用EVFILT_VNODE 发出文件打开或关闭事件(请参阅developer.apple.com/library/archive/documentation/System/…)。 FSEvents 也不处理这些事件。似乎使用内核扩展(如上面@TheDarkKnight 建议的那样)是获取文件打开/关闭事件的唯一机制。
      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多