我在用户空间创建一个文件(使用touch命令),我期望只看到一个OPEN和一个CLOSE文件操作,但是,我从内核通知中得到2个OPEN和3个CLOSE操作。操作顺序如下: 打开 - >关闭 - >打开 - >关闭--->关.... 谁能给我一些关于此的提示? 提前致谢。
答案 0 :(得分:2)
Kauth vnode和fileop听众一直很适合我。如果您收到对您没有意义的事件通知,我建议您使用内核调试器并查看回溯来在您的kauth侦听器回调中放置一个断点。 xnu源代码是可用的,因此您应该可以从中进行操作并回溯您收到相关通知的原因。
我知道如果文件有多个句柄,您可以获得额外的通知。因此,如果您打开文件dup()
文件描述符,然后关闭两个句柄,您将打开一个并关闭2个。就是这样,我很害怕。没有用于确定进程是否具有特定文件的剩余句柄的公共内核API。
至于为什么你收到2个开放式通知 - 可能与编写touch
的方式有关,或者与shell有关。通常,开放通知确实对应于open()
系统调用。如果有疑问,请编写自己的“触摸”工具,只调用打开和关闭一次,以测试您是否获得了正确的事件。如果需要,Apple的touch命令源也可用。
答案 1 :(得分:1)
如果你看一下VNode范围内发生的事情,它提供了更多细节,你会发现当你使用触摸时会发生很多事情。这是基于Singh的“Mac OSX Internals”的VNode监视器的程序的输出,当我创建一个名为'testtouch'的文件时: -
09:00:51.262 Pid:49(fseventsd)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTESREAD_SECURITY} 09:00:51.263 Pid:49(fseventsd)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTESREAD_SECURITY} 09:00:51.278 Pid:40(mds)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.278 Pid:40(mds)“/ Users / user / testtouch”VREG VT_HFS { WRITE_DATAACCESS } 09:00:51.278 Pid:40(mds)“/ Users / user / testtouch”VREG VT_HFS {READ_DATAACCESS} 09:00:51.279 Pid:40(mds)“/ Users / user / testtouch”VREG VT_HFS {EXECUTEACCESS} 09:00:51.279 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_DATA} 09:00:51.279 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.280 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS { WRITE_DATAACCESS } 09:00:51.280 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_DATAACCESS} 09:00:51.280 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {EXECUTEACCESS} 09:00:51.281 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.286 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_EXTATTRIBUTES} 09:00:51.286 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTESREAD_SECURITY} 09:00:51.287 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.287 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTES} 09:00:51.288 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS { WRITE_DATAACCESS } 09:00:51.288 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {READ_DATAACCESS} 09:00:51.288 Pid:559(mdworker)“/ Users / user / testtouch”VREG VT_HFS {EXECUTEACCESS} 09:00:51.289 Pid:40(mds)“/ Users / user / testtouch”VREG VT_HFS {READ_ATTRIBUTES}
有趣的是,您可以看到WRITE_DATAACCESS发生了3次。请注意,这是两个标志; WRITEDATA和ACCESS。
所以根据这些数据,它看起来就像我打开的那样与你所看到的相关,但你可能错过了某个地方的开放,或者由于某种原因,它没有通知你其中一个。
答案 2 :(得分:0)
MacOS X包含许多可以打开文件的东西。考虑Spotlight的索引。每当您修改文件(即打开它然后关闭它)时,Spotlight最终都会想要对其进行索引。这可以解释为什么您会看到多个打开/关闭事件。
您可以通过分析proc_selfpid()来验证这一点,proc_selfpid()将告诉您导致该事件的进程的PID。 (这是有效的,因为KAuth回调是直接从属于该进程的线程调用的,KAUTH_SCOPE_FILEOP
和KAUTH_SCOPE_VNODE
。)
另外我猜开启和关闭事件计数之间的区别可能是由进程fork引起的。考虑这种情况:
close()
或隐式进程终止时)