receive和process的过程
(一)
receive最终在fuse_kern_chan.c中的fuse_kern_chan_receive函数实现,使用系统调用读取
res = read(fuse_chan_fd(ch), buf, size);
其中fuse_chan_fd(ch)就是/dev/fuse, buf和size在fuse_loop_mt.c中fuse_do_work中定义。
struct fuse_buf fbuf = {
.mem = w->buf,
.size = w->bufsize,
};
其中的fbuf->mem就是buf,fbuf->size就是size。
size的值为 135168
这些值在 fuse_loop_mt.c::fuse_loop_start_thread中被赋值。
w->bufsize = fuse_chan_bufsize(mt->prevch);
w->buf = malloc(w->bufsize);
receive完成后,就是process。process函数最终是fuse_lowlevel.c中的fuse_ll_process_buf 。
-------process应该和receive类似,最终在fuse_kern_chan.c的fuse_kern_chan_send函数中调用 :
ssize_t res = writev(fuse_chan_fd(ch), iov, count);
writev也是一个系统调用 http://man7.org/linux/man-pages/man2/readv.2.html
(二)
执行ls dir1命令,fuse_ll_process_buf 会收到这些操作码:
3 FUSE_GETATTR
[getattr] Called
Attributes of / requested
27 FUSE_OPENDIR
28 FUSE_READDIR
--> Getting The List of Files of /
1 FUSE_LOOKUP
[getattr] Called
Attributes of /file54 requested
1
[getattr] Called
Attributes of /file349 requested
28 FUSE_READDIR
29 FUSE_RELEASEDIR
42 FUSE_BATCH_FORGET
每一个操作码都耗费fuse_do_work(fuse_lootp_mt.c)的一个循环。即一个receive,一个process。
最终按照操作码调用对应函数:
fuse_ll_ops[in->opcode].func(req, in->nodeid, inarg);
in根据fuse_ll_process_buf中的参数buf得来。
func函数也在fuse_lowlevel.c中,比如do_getattr函数,该函数调用:
req->f->op.getattr(req, nodeid, fip);
去执行用户定义的函数。 这里的op类型是struct fuse_lowlevel_ops,定义在fuse_lowlevel.c。
最终应该会去往fuse.c中的fuse_fs_getattr函数,在里面调用fs->op.getattr(path, buf);这个getattr函数在用户程序ssfs.c中定义。
op是在用户程序ssfs.c中定义,由fuse_main函数传递而来。
(三)
由于用户程序ssfs.c中只定义了三种操作,所以只会接受到三种操作。没有定义的操作,在fuse_lowlevel.c中进行对应的判断如if (req->f->op.setxattr)不成立于是调用fuse_reply_err(req, ENOSYS);进行回应。
(四)接上面(二)的结尾
static struct fuse_lowlevel_ops fuse_path_ops 在fuse.c中定义,有一句
.getattr = fuse_lib_getattr,
全局搜索只有这一处比较像lowlevel的getattr函数指针。
在fuse.c中,有
static void fuse_lib_getattr(fuse_req_t req, fuse_ino_t ino,struct fuse_file_info *fi)
这与fuse_lowlevel.c中的getattr函数里面的调用是一致的。
fuse_lib_getattr函数调用fuse_fs_fgetattr(f->fs, path, &buf, fi);, 里面调用fs->op.getattr(path, buf);
这里应该就是用户定义的getattr了。
这里fs->op正是struct fuse_operations类型的。这个变量由用户程序ssfs.c的fuse_main传入。
receive和process的过程的更多相关文章
- Erlang Process input queue
http://www.cnblogs.com/me-sa/archive/2011/11/05/erlang0012.html Erlang进程有自己的消息队列来保存接收到的消息,新接收到的消息放在队 ...
- C#的Process类调用第三方插件实现PDF文件转SWF文件
在项目开发过程中,有时会需要用到调用第三方程序实现本系统的某一些功能,例如本文中需要使用到的swftools插件,那么如何在程序中使用这个插件,并且该插件是如何将PDF文件转化为SWF文件的呢?接下来 ...
- Java中的APT的工作过程
Java中的APT的工作过程 APT即Annotatino Processing Tool, 他的作用是处理代码中的注解, 用来生成代码, 换句话说, 这是用代码生成代码的工具, 减少boilerpl ...
- CMMI能力成熟度模型集成的过程域
什么是CMMI CMMI全称是Capability Maturity Model Integration, 即能力成熟度模型集成,是由美国国防部(Office of the Secretary of ...
- Nagios配置文件详解
首先要看看目前Nagios的主配置路径下有哪些文件.[root@nagios etc]# ll总用量 152-rwxrwxr-x. 1 nagios nagios 1825 9月 24 14:40 ...
- 高性能Server---Reactor模型
原文地址:http://www.ivaneye.com/2016/07/23/iomodel.html 无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮 ...
- PostgreSQL笔记
本文针对目前最新版9.5.1,若非说明,文中所说文档即指官方文档.本人刚接触PostgreSQL不久,文中不免错漏,请大家指正:随着了解深入,本文[可能]会不定期更新补足. JSON PostgreS ...
- http2协议翻译(转)
超文本传输协议版本 2 IETF HTTP2草案(draft-ietf-httpbis-http2-13) 摘要 本规范描述了一种优化的超文本传输协议(HTTP).HTTP/2通过引进报头字段压缩以及 ...
- https那些事儿
(一)SSL/TLS协议运行机制的概述 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. (1) 窃听风险(eavesdropping):第三方可以获 ...
随机推荐
- python3里的Urllib库
首先Urllib是python内置的HTTP请求库. 包括以下模块: urllib.request 请求模块: urllib.error 异常处理模块: urllib.parse url解析模块: u ...
- UIApplicationDelegate详解
每 个iPhone应用程序都有一个UIApplication,UIApplication是iPhone应用程序的开始并且负责初始化并显示 UIWindow,并负责加载应用程序的第一个UIView到U ...
- 模拟赛QAQ
100 + 30 + 0 T1 叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现 ...
- DTD概述
1. 什么是XML文件 可扩展标记语言,标准通用标记语言的子集,是用于标记电子文件使其具有结构性的标记语言. 2. 什么是dtd文件 DTD(文档类型定义)的作用是定义XML文档的合法构建模块.它使用 ...
- Java常用API(Scanner,Random)匿名对象
API:即Application programming Interface,应用编程接口. Java中封装了许许多多的API供用户使用,Scanner与Random便是其中之一,API实际就是类,已 ...
- python 工具ScreenShoot
环境:windows python3 # -*- coding: UTF-8 -*- import time import os, win32gui, win32ui, win32con, win32 ...
- easyui datagrid client搜索、分页、排序
easyui datagrid的排序默认是server端排序.能够用sorter实现client排序[2].client分页可用filter实现[3].client搜索相同能够用filter实现. 不 ...
- Android Studio 一些方便使用的设置
相信非常多使用Eclipse的朋友,開始用Android Studio都是认为不是特别方便, a:比方怎样使鼠标放到方法上面,就有提示用法; b:怎样设置字体大小,和背景色; c:还有怎么查看Outl ...
- 解决查询access数据库含日文出现“内存溢出”问题
ACCESS有个BUG,那就是在使用 like 搜索时如果遇到日文就会出现“内存溢出”的问题,提示“80040e14/内存溢出”. 会出问题的SQL: where title like '%" ...
- PHP生成excel(1)
先到PHPExcel官网下载PHPExcel类 http://phpexcel.codeplex.com/ 把excel类包含进来,然后直接使用 <?php require "./PH ...