zoukankan      html  css  js  c++  java
  • 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传入。

  • 相关阅读:
    弹出窗口插件
    多彩百分比 动态进度条 投票效果显示(jquery)
    Oracle EBS Shipping(WSH)模块日志收集方法
    自动创建采购订单提示汇率值无效
    Using API FND_PROFILE.save to update profile from backend (转)
    二手房怎么买不会吃亏 八大高招教您投资理财
    删除list中的元素
    Create Stock Locator By Using API(EBS R12)
    Oracle EBS中查询Profile的各种SQL
    与账户别名相关的表
  • 原文地址:https://www.cnblogs.com/bettersky/p/6771372.html
Copyright © 2011-2022 走看看