(一)

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的过程的更多相关文章

  1. Erlang Process input queue

    http://www.cnblogs.com/me-sa/archive/2011/11/05/erlang0012.html Erlang进程有自己的消息队列来保存接收到的消息,新接收到的消息放在队 ...

  2. C#的Process类调用第三方插件实现PDF文件转SWF文件

    在项目开发过程中,有时会需要用到调用第三方程序实现本系统的某一些功能,例如本文中需要使用到的swftools插件,那么如何在程序中使用这个插件,并且该插件是如何将PDF文件转化为SWF文件的呢?接下来 ...

  3. Java中的APT的工作过程

    Java中的APT的工作过程 APT即Annotatino Processing Tool, 他的作用是处理代码中的注解, 用来生成代码, 换句话说, 这是用代码生成代码的工具, 减少boilerpl ...

  4. CMMI能力成熟度模型集成的过程域

    什么是CMMI CMMI全称是Capability Maturity Model Integration, 即能力成熟度模型集成,是由美国国防部(Office of the Secretary of ...

  5. Nagios配置文件详解

    首先要看看目前Nagios的主配置路径下有哪些文件.[root@nagios etc]# ll总用量 152-rwxrwxr-x. 1 nagios nagios 1825 9月  24 14:40 ...

  6. 高性能Server---Reactor模型

    原文地址:http://www.ivaneye.com/2016/07/23/iomodel.html 无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮 ...

  7. PostgreSQL笔记

    本文针对目前最新版9.5.1,若非说明,文中所说文档即指官方文档.本人刚接触PostgreSQL不久,文中不免错漏,请大家指正:随着了解深入,本文[可能]会不定期更新补足. JSON PostgreS ...

  8. http2协议翻译(转)

    超文本传输协议版本 2 IETF HTTP2草案(draft-ietf-httpbis-http2-13) 摘要 本规范描述了一种优化的超文本传输协议(HTTP).HTTP/2通过引进报头字段压缩以及 ...

  9. https那些事儿

    (一)SSL/TLS协议运行机制的概述 一.作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. (1) 窃听风险(eavesdropping):第三方可以获 ...

随机推荐

  1. 【shell】shell编程(二)-运算符

    上篇我们学会了如何使用及定义变量.按照尿性,一般接下来就该学基本数据类型的运算了. 没错,本篇就仍是这么俗套的来讲讲这无聊但又必学的基本数据类型的运算了. 基本数据类型运算 操作符 符号 语义 描述 ...

  2. linux下查看cpu使用情况

    1.在终端输入top 2.ubuntu系统自带有system monitor 3.sudo apt-get install sysstat 然后在终端输入:mpstat

  3. JavaSE的static、final、abstract修饰符

    static :静态常量,静态方法,静态代码块     静态变量:  静态变量属于类的,使用类名来访问,非静态变量是属于对象的,"必须"使用对象来访问.           注意: ...

  4. 10.Java web—JavaBean

    定义一个类,然后在jsp页面通过<jsp:useBean>标签调用 重点是类属性名要起得规则,一般是setXXX  getXXXX 新建一个类UserInfo public class U ...

  5. 使用Google浏览器做真机页面调试

    步骤1: 从Windows,Mac或Linux计算机远程调试Android设备上的实时内容.本教程将教您如何: 设置您的Android设备进行远程调试,并从开发机器中发现它.从您的开发机器检查和调试A ...

  6. Centos7配置Grafana对接OpenLDAP

    在grafana的主配置文件grafana.ini中开启LDAP认证 注意:grafana有两个地方需要指定(/etc/grafana/grafana.ini和/usr/share/grafana/c ...

  7. poj 2154 Color 欧拉函数优化的ploya计数

    枚举位移肯定超时,对于一个位移i.我们须要的是它的循环个数,也就是gcd(i,n),gcd(i,n)个数肯定不会非常多,由于等价于n的约数的个数. 所以我们枚举n的约数.对于一个约数k,也就是循环个数 ...

  8. Django-权限信息初始化

    数据库 from django.db import models class Menu(models.Model): """ 菜单组: """ ...

  9. iOS面试常见题

    1.耶稣有13个门徒,当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13个人围坐一圈,从第一个人開始循环报数,数到三排除,最后剩下的人就是叛徒 int people[13] = {1,2,3, ...

  10. GB2312,GBK,GB18030,UTF8四种汉字编码标准有什么差别和联系

     从GB2312.GBK 到 GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有同样的编码,后面的标准支持很多其它的字符.在这些编码中,英文和中文能够统一地处理. 区分中文编 ...