这与手册页中的示例几乎相同。一切都更新到最新版本。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