【问题标题】:How to correctly allocate a buffer for fuse readdir()?如何为 fuse readdir() 正确分配缓冲区?
【发布时间】:2019-12-10 03:30:46
【问题描述】:

在使用 C++ 包装器实现 FUSE 文件系统时,我遇到了readdir() 函数。这是我从passthrough.c 模仿的函数:

static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
               off_t offset, struct fuse_file_info *fi,
               enum fuse_readdir_flags flags)
{
    DIR *dp;
    struct dirent *de;

    (void) offset;
    (void) fi;
    (void) flags;

    dp = opendir(path);
    if (dp == NULL)
        return -errno;

    void* mybuf = malloc(10000);

    while ((de = readdir(dp)) != NULL) {
        struct stat st;
        memset(&st, 0, sizeof(st));
        st.st_ino = de->d_ino;
        st.st_mode = de->d_type << 12;
        if (filler(mybuf, de->d_name, &st, 0, 0))
            break;
    }

    closedir(dp);
    return 0;
}

(来源:https://github.com/libfuse/libfuse/blob/master/example/passthrough.c):

我的文件系统要求我在本地分配缓冲区,所以我没有使用参数化的void *buf,而是尝试像这样创建一个本地缓冲区:

void* buf = malloc(10000);

无论我分配了多大的缓冲区,当调用 filler() 时,我总是会遇到分段错误。作为一个控件,我尝试在完全工作的passthrough.c 示例中类似地分配一个本地缓冲区,但我仍然收到分段错误错误。这再次证实了我的问题在于缓冲区分配。

filler() fuse 函数中分配要使用的缓冲区的正确方法是什么?

【问题讨论】:

  • 通过 valgrind 运行您的代码。如果你的内存管理不善,它会告诉你在哪里。
  • 缓冲区大小不是问题。这可能是您的filler() 代码的问题。
  • @PaulOgilvie 此代码直接取自我作为源提供的 libfuse pasthrough.c 示例。 void casts 在那里,所以编译器不会抱怨未使用的参数。
  • 不过,filler 还是希望得到他原来的buf。你不能覆盖它。你应该做的是写你自己的my_filler 得到my_buf, buf, filler 并在里面调用filler(buf)
  • 只有内部的readdir 调用是使用RPC 完成的吗?我了解您已读取远程位置。但是filler() 不是在readdir 返回后调用localy 吗?

标签: c++ c fuse


【解决方案1】:

使用提供的缓冲区 *buf like

 if (filler(buf, de->d_name, &st, 0, 0))
        break;

它会工作得很好。不需要自己创建缓冲区。

这就是我使用它的方式,它工作得很好。

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 1970-01-01
    • 2014-06-10
    • 2011-09-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2014-01-25
    相关资源
    最近更新 更多