首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >风扇-在Kernel5.1中引入新标志的问题

风扇-在Kernel5.1中引入新标志的问题
EN

Stack Overflow用户
提问于 2019-11-24 06:26:41
回答 1查看 680关注 0票数 3

自内核5.1以来,引入了新的标志FAN_ATTRIBFAN_CREATEFAN_DELETEFAN_DELETE_SELFFAN_MOVED_FROMFAN_MOVED_TOFAN_MOVE_SELF。不幸的是,当我在函数fanotify_mark()中使用它们时,我会得到以下错误:

fanotify_mark:无效参数

但是当我使用像FAN_ACCESSFAN_OPENFAN_CLOSE_WRITE这样的旧标志时,一切都很好。

我不知道这是我的错,也不知道范诺蒂的实现有什么问题。

这是我的代码:

代码语言:javascript
复制
#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)上运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-16 23:53:59

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

此示例不包括内核5.1中的新特性,这些特性依赖于FAN_REPORT_FID标志。

试着使用最新的fanotify手册中提供的示例"fanotify_fid.c“。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59015209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档