Macos OSX使用FSevents或内核队列捕获不存在文件的打开

Macos OSX使用FSevents或内核队列捕获不存在文件的打开,macos,filesystems,kqueue,xnu,Macos,Filesystems,Kqueue,Xnu,我想构建一个用户空间工具,用于监视任何试图打开不存在的文件的行为,该文件使用特定的路径+名称(它不会出现在文件系统中) 看看可用的选项,最符合我需要的是使用kevent框架 下面是由path表示的监视器文件的示例,它需要文件描述符。如果由于文件不存在,open失败,可能有一个选项可以监视对path事件的每次访问 fd = open(path, O_EVTONLY); user_data = path; /* Set up a list of events to monitor. */ vn

我想构建一个用户空间工具,用于监视任何试图打开不存在的文件的行为,该文件使用特定的路径+名称(它不会出现在文件系统中)

看看可用的选项,最符合我需要的是使用kevent框架

下面是由
path
表示的监视器文件的示例,它需要文件描述符。如果由于文件不存在,
open
失败,可能有一个选项可以监视对
path
事件的每次访问

 fd = open(path, O_EVTONLY);
 user_data = path;

/* Set up a list of events to monitor. */
vnode_events = NOTE_DELETE |  NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE;
EV_SET( &events_to_monitor[0], fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, vnode_events, 0, user_data);
int event_count = kevent(kq, events_to_monitor, NUM_EVENT_SLOTS, event_data, num_files, NULL);

我不知道这是否对您有帮助,但它肯定可以通过dtrace完成。如果您试图跟踪特定的内容,这显然是足够的,但在集成到某些软件中时可能会出现问题,因为dtrace的大部分在启用SIP的情况下失败。否则,我可能会检查内核的VFS源代码,以查找基于路径的vnode查找,并查看其中是否有任何内容可以在失败案例中挂钩。dtrace听起来是个好主意,但问题是我希望从C代码运行此检查。您知道是否有专门的API用于此目的吗?您可以从自己的代码中使用dtrace,但正如我所提到的,您几乎肯定会遇到SIP问题。(系统完整性保护)要求用户禁用SIP通常是不可接受的。我会检查您是否可以使用dtrace CLI实用程序获取数据,即使先启用了SIP,并且只有在启用SIP的情况下才能使用嵌入dtrace的方法。我不知道这是否对您有帮助,但使用dtrace肯定可以做到。如果您试图跟踪特定的内容,这显然是足够的,但在集成到某些软件中时可能会出现问题,因为dtrace的大部分在启用SIP的情况下失败。否则,我可能会检查内核的VFS源代码,以查找基于路径的vnode查找,并查看其中是否有任何内容可以在失败案例中挂钩。dtrace听起来是个好主意,但问题是我希望从C代码运行此检查。您知道是否有专门的API用于此目的吗?您可以从自己的代码中使用dtrace,但正如我所提到的,您几乎肯定会遇到SIP问题。(系统完整性保护)要求用户禁用SIP通常是不可接受的。我会检查您是否可以使用dtrace CLI实用程序获取数据,即使先启用了SIP,并且只有在启用SIP的情况下才能使用嵌入dtrace的方法。