FUSE 文件系统 example部分 源码注释 (libfuse 2…
2019-01-15 07:00:52来源:博客园 阅读 ()
本篇文章主要是针对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!\n"; 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); }
保持更新,转载请注明出处。如果你有什么问题,欢迎在留言区进行留言交流。https://www.cnblogs.com/xuyaowen/p/fuse-example-source-code.html
原文链接:https://www.cnblogs.com/xuyaowen/p/fuse-example-source-code.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Linux系统如何设置开机自动运行脚本? 2020-06-11
- 文件压缩和打包 2020-06-11
- RAID 1 软件实现(Linux 系统) 2020-06-10
- 厉害了!知道这样重命名文件都是大佬级别! 2020-06-09
- 一个骚命令防止你的文件被误删除! 2020-06-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash