自内核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这样的旧标志时,一切都很好。
我不知道这是我的错,也不知道范诺蒂的实现有什么问题。
这是我的代码:
#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);
}
}
}该代码由根用户在UbuntuServer19.10(GNU/Linux5.3.0-23通用x86_64)上运行。
发布于 2020-04-16 23:53:59
您正在使用来自fanotify_example.c的代码
此示例不包括内核5.1中的新特性,这些特性依赖于FAN_REPORT_FID标志。
试着使用最新的fanotify手册中提供的示例"fanotify_fid.c“。
https://stackoverflow.com/questions/59015209
复制相似问题