• FUSE 文件系统 example部分 源码注释 (libfuse 2.9.9)


    本篇文章主要是针对fuse-2.9.9 Example 部分 给出的源码,结合官方文档,以及网上的资料给出注释,希望能给正在学习的你们一点帮助。


    Hello.c

    /*
      FUSE: Filesystem in Userspace
      Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>
    
      
      This program can be distributed under the terms of the GNU GPL.
      See the file COPYING.
    
      gcc -Wall hello.c `pkg-config fuse --cflags --libs` -o hello
    */
    
    #define FUSE_USE_VERSION 26 //先定义, fuse.h中有判断
    
    #include <fuse.h>
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <fcntl.h>
    
    static const char *hello_str = "Hello World!
    ";
    static const char *hello_path = "/hello";
    
    // 与函数stat()类似,用于得到文件属性,并将其存入到结构体struct stat当中 struct stat *stbuf
    static int hello_getattr(const char *path, struct stat *stbuf)
    {
        int res = 0;
    
        memset(stbuf, 0, sizeof(struct stat));  // 使用memset进行初始化结构体
        if (strcmp(path, "/") == 0) {
            stbuf->st_mode = S_IFDIR | 0755; // S_IFDIR 用于说明 / 为目录
            stbuf->st_nlink = 2;
        } else if (strcmp(path, hello_path) == 0) {
            stbuf->st_mode = S_IFREG | 0444; // S_IFREG 用于说明/hello 为常规文件
            stbuf->st_nlink = 1;
            stbuf->st_size = strlen(hello_str); // 设置文件长度为hello_str的长度
        } else
            res = -ENOENT; // 返回错误信息,没有该文件或者目录
    
        return res; // 成功执行的时候,此函数返回值为 0
    }
    
    // 该函数用于读取目录中的内容,并在/目录下增加了. .. hello 三个目录项
    static int hello_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
                 off_t offset, struct fuse_file_info *fi)
    {
        (void) offset;
        (void) fi;
    
        if (strcmp(path, "/") != 0)
            return -ENOENT;
    
        /* fill, 其作用是在readdir函数中增加一个目录项
        typedef int (*fuse_fill_dir_t) (void *buf, const char *name,
            const struct stat *stbuf, off_t off);
        */
    
        filler(buf, ".", NULL, 0);
        filler(buf, "..", NULL, 0);
        filler(buf, hello_path + 1, NULL, 0); //指针+1(/hello), 即增加 hello 目录项,去掉前面的'/'
    
        return 0;
    }
    
    // 打开文件函数
    static int hello_open(const char *path, struct fuse_file_info *fi)
    {
        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)
    {
        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, // 读文件函数
    };
    
    // 调用 fuse_main , 把控制权交给了fuse
    int main(int argc, char *argv[])
    {
        return fuse_main(argc, argv, &hello_oper, NULL);
    }

     2019.6.30

    这个文档好像很久没有更新了,项目fuse使用完成了,例子不想更新了。大家有什么问题可以在评论区给我留言。

    保持更新,转载请注明出处。如果你有什么问题,欢迎在留言区进行留言交流。https://www.cnblogs.com/xuyaowen/p/fuse-example-source-code.html 

  • 相关阅读:
    python pytesseract模块,报错
    CSS清除浮动_清除float浮动
    CSS中@import与link的具体区别
    js substr和substring的区别
    WebStorm 自定义字体+颜色+语法高亮+导入导出用户设置
    Jquery中的重置
    table标签中thead、tbody、tfoot的作用
    下拉列表框的几个属性
    使用GDI绘制文本
    使用GDI绘制一条直线
  • 原文地址:https://www.cnblogs.com/xuyaowen/p/fuse-example-source-code.html
Copyright © 2020-2023  润新知