这几乎与手册页中的示例相同。一切都更新到最新版本。 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
答案 0 :(得分:0)
这是因为FAN_OPEN_PERM需要另一个程序来授予权限。这几乎是从fanotify手册页中的示例逐字逐句 - 这使得它非常不幸,因为削减程序会导致硬OS块。所以看吧。
我的实际意图是监控文件访问。为此,一个使用FAN_OPEN,而不是FAN_OPEN_PERM。