【问题标题】:Writing a simple filesystem in C using FUSE使用 FUSE 用 C 语言编写一个简单的文件系统
【发布时间】:2014-06-06 04:20:41
【问题描述】:

我已经学会了 hello.c。 它可以在mountfile下创建一个hello文件。 但是我不知道如何在mountfile下创建一个文件夹,然后在mountfile/folderIcreate下创建hello。 然后我可以使用 cat mountfile/folderIcreate/hello 代码类似于简单的hello.c

#define FUSE_USE_VERSION 30

#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>

static const char *hello_str = "Hello World!\n";
static const char *add_path = "/add";
static const char *div_path = "/div";
static const char *hello_path = "/hello";

static int hello_getattr(const char *path, struct stat *stbuf)
{
    int res = 0;

    printf("%s", path);

    memset(stbuf, 0, sizeof(struct stat));
    if (strcmp(path, "/") == 0) 
    {
        stbuf->st_mode = S_IFDIR | 0755;
        stbuf->st_nlink = 2;
    } 
    else if (strcmp(path, hello_path) == 0) 
    {
        stbuf->st_mode = S_IFREG | 0444;
        stbuf->st_nlink = 1;
        stbuf->st_size = strlen(hello_str);
    }
    else if (strcmp(path, add_path) == 0) 
    {
        stbuf->st_mode = S_IFDIR | 0755;
        stbuf->st_nlink = 3;
        if (strcmp(path, add_path1) == 0) 
        {
            stbuf->st_mode = S_IFREG | 0444;
            stbuf->st_nlink = 1;
            stbuf->st_size = strlen(hello_str);
        }
    }
    else if(strcmp(path, div_path) == 0)
    {
        stbuf->st_mode = S_IFDIR | 0755;
        stbuf->st_nlink = 3;
    } 
    else if(strcmp(path, div_path) == 0)
    {
        stbuf->st_mode = S_IFDIR | 0755;
        stbuf->st_nlink = 3;
    } 
    else
        res = -ENOENT;

    return res;
}

static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
         off_t offset, struct fuse_file_info *fi)
{
    printf("%s", path);
    (void) offset;
    (void) fi;

    if (strcmp(path, "/") != 0)
        return -ENOENT;

    filler(buf, ".", NULL, 0);
    filler(buf, "..", NULL, 0);
    filler(buf, hello_path + 1, NULL, 0);
    filler(buf, add_path + 1, NULL, 0);
    filler(buf, div_path + 1, NULL, 0);

    return 0;
}

static int hello_open(const char *path, struct fuse_file_info *fi)
{
    printf("%s", path);
    if (strcmp(path, hello_path) != 0)
        return -ENOENT;

    if ((fi->flags & 3) != O_RDONLY)
        return -EACCES;

    return 0;
}

static int hello_read(const char *path, char *buf, size_t size, off_t offset,
          struct fuse_file_info *fi)
{
    printf("%s", path);
    size_t len;
    (void) fi;
    if(strcmp(path, hello_path) != 0)
        return -ENOENT;

    len = strlen(hello_str);
    if (offset < len) {
        if (offset + size > len)
            size = len - offset;
        memcpy(buf, hello_str + offset, size);
    } else
        size = 0;

    return size;
}

static struct fuse_operations hello_oper = {
    .getattr    = hello_getattr,
    .readdir    = hello_readdir,
    .open       = hello_open,
    .read       = hello_read,
};

int main(int argc, char *argv[])
{
    return fuse_main(argc, argv, &hello_oper, NULL);
}

有人可以举一个简单的例子来说明如何在不更改结构 fuse_operations 的情况下修改上面的代码。 谢谢!

【问题讨论】:

  • 修正缩进会让这个问题更愉快。

标签: c linux operating-system fuse


【解决方案1】:

要使目录在 FUSE 文件系统中正常工作,需要满足以下条件:

  • 目录必须是stat()-able,并且应该返回适​​合目录的属性(例如,可读、可执行和S_IFDIR)。

  • 目录必须是readdir()-able。

  • 目录需要出现在其父目录的readdir() 列表中。 (这在某种程度上是可选的,但目录出现在列表中是不寻常的,并且会使其难以访问!)

  • 目录下的任何新路径都需要为stat()able 和open()/read()able(如果适用)。

这些都不是新操作;它们只是现有的扩展。如果您对如何进行其中一些更改有任何具体问题,请澄清您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多