我正在OS X上玩rb-kqueue,我不知道如何触发extend
标志。
从OpenBSD kqueue man page(也与OS X手册页匹配)中
NOTE_EXTEND描述符引用的文件已扩展
这是非常循环的。
NOTE_EXTEND对于常规文件,由描述符引用的文件 扩展了。对于目录,报告目录条目为 添加或删除,作为重命名操作的结果。 NOTE_EXTEND 在目录中更改名称时不会报告事件。
这是更具描述性的,但是,我一直在目录上运行kqueue并尝试尝试,因为我可能无法触发扩展标志。我已经尝试过mv
,rename
,xattr
(因为搜索“ extended”会带来很多有关扩展属性的结果),使用mkdir
添加子目录和文件,并且touch
并重定向,但没有任何结果导致extend
标志是事件的一部分,只是write
和/或link
。
因此,我对extend
的真正含义感到困惑。仅仅是因为我在OS X上运行它吗?
非常感谢收到任何帮助或见识。
答案 0 :(得分:1)
我希望对此问题有所启发。
标志NOTE_EXTEND
对应于对文件执行的操作。根据您的情况,您应该在文件大小增加时触发操作。
引用原始论文-Kquote: A generic and scalable event notification facility:
fflags字段用于指定描述符上的哪些动作 该申请对注册感兴趣,在返回时, 发生了哪些动作。可能的操作是:
- 注意删除
- 注意写
- 注意扩展
- 注意属性
- 注意链接
- 注意重命名
这些对应于文件系统在 文件,因此在此不再赘述。这些注释可能是OR-d 如果发生了多个操作,则在返回的kevent中一起使用。 例如:写入文件,然后重命名。最终通用 filter是PROC过滤器,用于检测过程更改。为了这 过滤器,ident字段被解释为进程标识符。这个 过滤器可以监视几种类型的事件以及 控制此过滤器的过程如图3所示
EVFILT PROC
的图3:
Input/Output
标志:
NOTE EXIT
进程已退出。
NOTE FORK
流程称为 fork()
NOTE EXEC
进程通过execve(2)或 类似的电话。
NOTE TRACK
在fork()调用中遵循一个过程。的 父进程将在标志字段中设置NOTE TRACK
的情况下返回, 而子进程将返回带有NOTE CHILD
的fflags和 数据中的父PID。
Output
仅标志:
NOTE CHILD
这是 TRACKed进程的子进程,称为fork()。
NOTE TRACKERR
如果系统无法将事件附加到该标志,则返回此标志 子进程,通常是由于资源限制。