如何编写Linux新的`fanotify`文件系统监视function?

fanotify ,build立在fsnotify ,应该取代inotify代替了dnotify 。 是否有一些好的编程示例或现有的实用程序使用fanotify来监视文件系统中的更改? fanotify提供多less细节?

Solutions Collecting From Web of "如何编写Linux新的`fanotify`文件系统监视function?"

这篇LWN文章经常被引用为fanotify文档的来源。 但说明似乎已经过时了。 fanotify不再使用套接字连接。 相反,有两个新的libc函数包装syscalls,在sys/fanotify.h声明。 一个叫做fanotify_init ,另一个是fanotify_mark 。 在撰写本文时,这些系统调用仍然包含在缺少手册页的列表中 。 然而,这些手册页有一个包含草稿的邮件 。 通过这些手册页的组合,查看标题,以及一些试验和错误,你应该能够做到这一点。

似乎最初为fanotify设想的一些功能不再以这种方式得到支持。 例如,LWN文章描述了一个FAN_GLOBAL_LISTENER标志,它将隐式地标记整个文件系统树,除非部分被明确地标记为未标记。 目前的界面没有这样的规定,但使用下面的标志可以达到类似的结果:

 fanotify_mark(fan, FAN_MARK_ADD | FAN_MARK_MOUNT, FAN_OPEN | FAN_EVENT_ON_CHILD, AT_FDCWD, "/") 

当inotify事件提供被访问对象的路径作为事件的一部分时,fanotify会为其打开一个文件描述符。 为了将此描述符转换为路径名,可以使用proc文件系统中的相应条目,如此处所述。

这是一个简单的例子,它只是打印每个打开的文件的名称:

 #include <fcntl.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/fanotify.h> #include <sys/stat.h> #include <sys/types.h> #define CHK(expr, errcode) if((expr)==errcode) perror(#expr), exit(EXIT_FAILURE) int main(int argc, char** argv) { int fan; char buf[4096]; char fdpath[32]; char path[PATH_MAX + 1]; ssize_t buflen, linklen; struct fanotify_event_metadata *metadata; CHK(fan = fanotify_init(FAN_CLASS_NOTIF, O_RDONLY), -1); CHK(fanotify_mark(fan, FAN_MARK_ADD | FAN_MARK_MOUNT, FAN_OPEN | FAN_EVENT_ON_CHILD, AT_FDCWD, "/"), -1); for (;;) { CHK(buflen = read(fan, buf, sizeof(buf)), -1); metadata = (struct fanotify_event_metadata*)&buf; while(FAN_EVENT_OK(metadata, buflen)) { if (metadata->mask & FAN_Q_OVERFLOW) { printf("Queue overflow!\n"); continue; } sprintf(fdpath, "/proc/self/fd/%d", metadata->fd); CHK(linklen = readlink(fdpath, path, sizeof(path) - 1), -1); path[linklen] = '\0'; printf("%s opened by process %d.\n", path, (int)metadata->pid); close(metadata->fd); metadata = FAN_EVENT_NEXT(metadata, buflen); } } } 

我刚刚了解到fanotify,似乎非常好。 非常漂亮的界面!

这不是在Linus树,但我想它将达到Linux 2.6.33和以前的测试(我注意到今天在LKML的一些补丁)。 在原来的补丁中,他们宣布了一个GIT树,因此您可能可以从那里构建一个测试内核。 你也可能会发现测试混帐树。

我找不到使用它的工具,但我想他们会很快来。

这里有一个例子,在电子邮件的结尾处:

http://lwn.net/Articles/339253/

如果您真的对这个新功能感兴趣,您可能需要监视Linux内核邮件列表并在其中进行交互。 您也可以等到公用事业被释放或开发自己的。

关于细节,似乎fanotify比inotify提供更少的事件。 我想这可能会在未来发生变化,但由于这是一个全新的功能,所以现在我不能说这个。