首页 > 解决方案 > fanotify - 内核 5.1 中引入的新标志的问题

问题描述

从 Kernel 5.1 开始,引入了新标志FAN_ATTRIBFAN_CREATEFAN_DELETEFAN_DELETE_SELF、和。不幸的是,当我在函数中使用它们时,我得到了这个错误:FAN_MOVED_FROMFAN_MOVED_TOFAN_MOVE_SELFfanotify_mark()

fanotify_mark:无效参数

但是当我使用 , 和 之类的旧标志时FAN_ACCESSFAN_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) 上运行。

标签: c++fanotify

解决方案


您正在使用来自 fanotify_example.c 的代码

此示例不包括内核 5.1 中依赖 FAN_REPORT_FID 标志的新功能。

尝试使用最新手册页中为 fanotify 提供的示例“fanotify_fid.c”。


推荐阅读