c++ - fanotify - 内核 5.1 中引入的新标志的问题
问题描述
从 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) 上运行。
解决方案
您正在使用来自 fanotify_example.c 的代码
此示例不包括内核 5.1 中依赖 FAN_REPORT_FID 标志的新功能。
尝试使用最新手册页中为 fanotify 提供的示例“fanotify_fid.c”。
推荐阅读
- php - 如何在 Visual Studio Code 中的 PHP 函数/类/变量中显示数字引用
- c# - 更改 dateTime 的 get 和 set 属性
- android - 将应用程序重新提交到 google play 商店,但仍然存在被拒绝的警告标志
- android - Kotlin Android - 从 Fragment 中的 AsyncTask 更新 UI
- android-studio - 如何在android studio中配置flutter项目?
- mysql - 如何根据 MySQL 中不同的列值组合行
- topic-modeling - MALLET:修剪训练数据时的主题推断
- excel - 如何在 Excel 的 Visual Basic 中简化单元格选择
- seal - SEAL 中的 BFV 对称密钥加密
- sql - 各大洲及其最常用的货币