首页 > 解决方案 > Kqueue dirextended 看什么动作?

问题描述

我在 OS X 上玩rb-kqueue,但我不知道如何让extend标志触发。

OpenBSD kqueue 手册页(也与 OS X 手册页匹配):

NOTE_EXTEND 描述符引用的文件被扩展

这是非常循环的。

FreeBSD kqueue 手册页有:

NOTE_EXTEND 对于常规文件,描述符引用的文件被扩展。对于目录,报告作为重命名操作的结果添加或删除了目录条目。在目录内更改名称时不会报告 NOTE_EXTEND 事件。

这更具描述性,但是,我一直在目录上运行 kqueue 并尝试我可能无法触发扩展标志。我试过mv, rename, (因为搜索“扩展”会返回很多关于扩展属性的结果),使用and和重定向xattr添加子目录和文件,但没有任何结果导致标志成为事件的一部分,只是和/或。mkdirtouchextendwritelink

因此,我对extend真正的东西感到困惑。仅仅是因为我在 OS X 上运行它吗?

标签: rubyosx-maverickskqueue

解决方案


我希望对这个问题有所了解。

该标志NOTE_EXTEND对应于对文件采取的操作。在您的情况下,您应该在文件大小增加时触发该操作。

推理

引用原始论文 - Kquote:通用且可扩展的事件通知工具

fflags 字段用于指定应用程序在注册时感兴趣的描述符上的哪些操作,以及在返回时发生了哪些操作。可能的行动是:

  • 注意删除
  • 注意写
  • 注意扩展
  • 注释属性
  • 注意链接
  • 注意重命名

这些对应于文件系统对文件执行的操作,因此这里不再解释。如果发生了多个操作,这些注释可能会在返回的 kevent 中一起进行 OR-d。例如:一个文件被写入,然后重命名。最后一个通用过滤器是 PROC 过滤器,它检测过程变化。对于此过滤器,ident 字段被解释为进程标识符。此过滤器可以监视多种类型的事件,控制此过滤器的标志如图 3 所示

图 3 为EVFILT PROC

Input/Output标志:

  • NOTE EXIT进程退出。

  • NOTE FORK进程调用 fork()

  • NOTE EXEC进程通过 execve(2) 或类似调用执行了一个新进程。

  • NOTE TRACK遵循跨 fork() 调用的过程。父进程将NOTE TRACK在 flags 字段中返回 set,而子进程将NOTE CHILD在 fflags 中返回 set,在 data 中返回父 PID。

Output仅标志:

  • NOTE CHILD这是一个名为 fork() 的 TRACKed 进程的子进程。

  • NOTE TRACKERR 如果系统无法将事件附加到子进程,则返回此标志,通常是由于资源限制。


推荐阅读