【问题标题】:opendir() in FUSEFUSE 中的 opendir()
【发布时间】:2012-07-31 06:49:22
【问题描述】:

FUSExxx_readdir()的实现中,我使用如下代码:

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

    (void) offset;
    (void) fi;

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

    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(buf, de->d_name, &st, 0))
            break;
    }

    closedir(dp);
    return 0;
}

然后,在文件夹上编译并执行:

./hello /tmp/hello/

当我使用ls /tmp/hello/ 命令时,结果如下:

bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var

但是,我没有在/tmp/hello/ 中创建任何文件或目录。那么,当我使用ls 命令时,为什么这些目录会驻留在它上面?

【问题讨论】:

    标签: fuse


    【解决方案1】:

    你打电话:

    dp = opendir(path);
    

    开始您的readdir 实施。当您调用 path 时,它是 relative 到文件系统的根目录,而不是系统上的绝对路径。

    所以在 /tmp/hello/ 中,path 的值将是 '/',因为文件系统需要知道它们安装位置的详细信息是没有意义的。那里有一个深思熟虑的抽象,使得每个文件系统只关心它存储的东西。

    【讨论】:

    • 那么,如果我想让readdir 可以显示真正在/tmp/hello 文件夹中的文件和目录呢?我该怎么办?
    • @injoy - 这很棘手,因为您必须确保您的 opendir 调用不会被传回 fuse。更好的设计是将挂载点和您显示为不同目录的目录,即您的 FUSE 程序挂载在 /tmp/hello 中的 /tmp/hello.real。您可以在运行时将“真实”路径传递给程序,然后记录下来。
    • 谢谢,顺便说一句,你能推荐一些使用 FUSE 的好的简单(比hello.c 更复杂)FS 实现吗?
    • @injoy - FUSE 网站上有一个列表。我建议localfs,因为它听起来与您正在尝试做的事情相似。网络的通常是很好的例子,我想我上次找 httpfs 时读过。
    猜你喜欢
    • 2021-05-16
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2012-05-09
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多