21

fanotify,建在上面fsnotify,应该是换inotify哪个换dnotify的。是否有一些好的编程示例或现有实用程序可fanotify用于监视文件系统中的更改?提供了多少细节fanotify

4

3 回答 3

19

这篇 LWN 文章经常被引用为 fanotify 的文档来源。但是那里的描述似乎已经过时了。fanotify 不再使用套接字连接工作。相反,有两个新的 libc 函数包装系统调用,在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);
    }
  }
}
于 2012-11-14T23:33:10.177 回答
13

Linux 手册页中提供了 fanotify API 的文档:


这里有一些例子,fatrace 是最详细的。

Go 和 Python 存在绑定。

于 2012-11-29T19:21:48.887 回答
6

我刚刚了解了 fanotify,它看起来非常好。非常漂亮的界面!

它还没有在 Linus 树中,但我猜它会在 Linux 2.6.33 和之前的版本中用于测试(我今天注意到 LKML 中的一些补丁)。在原始补丁中,他们宣布了一个 GIT 树,因此您可以从那里构建一个测试内核。您可能还会发现测试 git 树。

我找不到使用它的实用程序,但我想它们很快就会出现。

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

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

如果你真的对这个新特性感兴趣,你可能想要监视 Linux 内核邮件列表并在那里进行交互。您也可以等到实用程序发布或开发自己的实用程序。

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

于 2009-12-04T14:25:21.237 回答