fanotify gremlin --- hard no-return fail(在gdb下)

时间:2014-12-25 07:17:16

标签: fanotify

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

#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

1 个答案:

答案 0 :(得分:0)

这是因为FAN_OPEN_PERM需要另一个程序来授予权限。这几乎是从fanotify手册页中的示例逐字逐句 - 这使得它非常不幸,因为削减程序会导致硬OS块。所以看吧。

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