从 Kernel 5.1 开始,引入了新标志FAN_ATTRIB
、FAN_CREATE
、FAN_DELETE
、FAN_DELETE_SELF
、和。不幸的是,当我在函数中使用它们时,我得到了这个错误:FAN_MOVED_FROM
FAN_MOVED_TO
FAN_MOVE_SELF
fanotify_mark()
fanotify_mark:无效参数
但是当我使用 , 和 之类的旧标志时FAN_ACCESS
,FAN_OPEN
一切FAN_CLOSE_WRITE
正常。
我不知道这是我的错还是 fanotify 实现中的错误。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/fanotify.h>
#include <iostream>
using namespace std;
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;
// Init fanotify structure
fan = fanotify_init(FAN_CLASS_NOTIF, O_RDWR);
if(fan == -1)
{
perror("fanotify_init");
exit(EXIT_FAILURE);
}
int ret = fanotify_mark(fan,
FAN_MARK_ADD,
FAN_CREATE | FAN_EVENT_ON_CHILD,
//FAN_ACCESS | FAN_OPEN | FAN_EVENT_ON_CHILD,
AT_FDCWD,
"/tmp/myfolder"
);
if(ret == -1)
{
perror("fanotify_mark");
exit(EXIT_FAILURE);
}
while(1)
{
buflen = read(fan, buf, sizeof(buf));
metadata = (struct fanotify_event_metadata*)&buf;
while(FAN_EVENT_OK(metadata, buflen))
{
if (metadata->mask & FAN_Q_OVERFLOW)
{
printf("Queue overflow!\n");
continue;
}
// Resolve path, using automatically opened fd
sprintf(fdpath, "/proc/self/fd/%d", metadata->fd);
linklen = readlink(fdpath, path, sizeof(path) - 1);
path[linklen] = '\0';
printf("%s\n", path);
close(metadata->fd);
metadata = FAN_EVENT_NEXT(metadata, buflen);
}
}
}
该代码由 root 用户在 Ubuntu Server 19.10 (GNU/Linux 5.3.0-23-generic x86_64) 上运行。