如何正确分配Fuse ReadDir()的缓冲区

How to correctly allocate a buffer for fuse readdir()?

本文关键字:缓冲区 ReadDir 何正确 分配 Fuse      更新时间:2023-10-16

在使用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/master/example/passplash.c(:

我的文件系统要求我本地分配缓冲区,因此我不使用参数化的void *buf,而是尝试创建一个本地缓冲区,例如:

void* buf = malloc(10000);

不管我分配了多大的缓冲区,当调用filler()时,我总是会遇到分段故障。作为控件,我试图在完全工作的passthrough.c示例中类似地分配本地缓冲区,但我仍然收到分段故障错误。这重申了我的问题在于缓冲区分配。

分配用于filler() Fuse功能中使用的缓冲区的适当方法是什么?

使用提供的缓冲区 *buf

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

它可以正常工作。不必创建自我缓冲。

这就是我的使用方式,它可以正常工作。