Kqueue目录扩展监视什么动作?

时间:2018-07-12 15:37:45

标签: ruby osx-mavericks kqueue

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

OpenBSD kqueue man page(也与OS X手册页匹配)中

  

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

这是非常循环的。

FreeBSD kqueue man page具有:

  

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

这是更具描述性的,但是,我一直在目录上运行kqueue并尝试尝试,因为我可能无法触发扩展标志。我已经尝试过mvrenamexattr(因为搜索“ extended”会带来很多有关扩展属性的结果),使用mkdir添加子目录和文件,并且touch并重定向,但没有任何结果导致extend标志是事件的一部分,只是write和/或link

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

非常感谢收到任何帮助或见识。

1 个答案:

答案 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   如果系统无法将事件附加到该标志,则返回此标志   子进程,通常是由于资源限制。

  •