0

这与手册页中的示例几乎相同。一切都更新到最新版本。gcc 是 4.9.2。gdb 是 7.8.1。linux内核是3.17.6-1(64位)。安装是最近的拱形引导程序。这是缩减的案例:

#define _GNU_SOURCE     /* Needed to get O_LARGEFILE definition */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <poll.h>

#include <sys/fanotify.h>


int main(int argc, char *argv[]) {
  int fd;

  fd = fanotify_init(FAN_CLOEXEC | FAN_CLASS_CONTENT | FAN_NONBLOCK, O_RDONLY | O_LARGEFILE);
  if (fd == -1) exit(1);

  fprintf(stderr, "calling fanotify_mark: fd=%d\n", fd);

  if (fanotify_mark(fd, FAN_MARK_ADD | FAN_MARK_MOUNT, FAN_OPEN_PERM | FAN_CLOSE_WRITE, -1, "/") == -1) exit(2);

  fprintf(stderr, "in gdb step through with 'n' for repeat.\n");
  fprintf(stderr, "  (and sometimes otherwise), a ^C works, but a ^Z and then ^C does not.\n");
}

大多数时候,这很好用,但有时却不行。我认为这是 fanotify_mark 永远不会返回的时候。在尝试调试时,我发现我可以(不能)复制它进行调试。如果我使用 gdb 并尝试使用 'n' 单步执行,fanotify_mark() 将永远不会返回并且是不可中断的 (^C, ^Z)。

这可以在其他地方复制,还是我做错了什么?

/iaw

4

1 回答 1

0

发生这种情况是因为 FAN_OPEN_PERM 需要另一个程序来授予权限。这几乎是来自 fanotify 手册页中的示例的逐字记录——这使得它相当不幸,因为缩减程序可能会导致硬操作系统阻塞。所以看吧。

我的实际意图是监视文件访问。为此,使用 FAN_OPEN,而不是 FAN_OPEN_PERM。

于 2015-01-03T22:16:00.747 回答