后台while收发过程
Posted longbigfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后台while收发过程相关的知识,希望对你有一定的参考价值。
fuse_loop_mt.c 中fuse_do_work函数使用while循环在后台不断运行,每一个while循环中,主要有两个操作。
1. fuse_session_receive_buf(mt->se, &fbuf, &ch); fuse_session.c
2. fuse_session_process_buf(mt->se, &fbuf, ch);
操作1使用 se->receive_buf(se, buf, chp)读取buffer内容。
操作2使用se->process_buf(se->data, buf, ch);处理buffer内容。
receive_buf和process_buf是两个函数指针,属于fuse_i.h的struct fuse_session的成员。
搜索整个源文件,只发现在fuse_lowlevel.c中的struct fuse_session *fuse_lowlevel_new_common有一句
se->receive_buf = fuse_ll_receive_buf; //fuse_ll_receive_buf函数也在该源文件中。
经过打印发现,就是这个函数在处理接受。
//////fuse_ll_receive_buf函数有个重要的操作是创建pipe, 调用 llp = fuse_ll_get_pipe(f);
////static struct fuse_ll_pipe *fuse_ll_get_pipe(struct fuse_ll *f)函数使用
//// res = pipe(llp->pipe);
/////创建pipe。
这个函数会转到fallback标签,因为 !(f->conn.want & FUSE_CAP_SPLICE_READ) 为真,一个是16,一个是512,与以后为0,取反为真。
于是调用 fuse_chan_recv(struct fuse_chan **chp, char *buf, size_t size 函数。该函数在fuse_session.c中。
在一开始的两个操作中,都有if语句,else是进入 fuse_chan_recv函数,但是那里都没有进入else,而最终还是在这里进入了该函数。
然后调用int res=ch->op.receive(chp, buf, size);
其中ch是struct fuse_chan **类型,定义在fuse_session.c中。op是struct fuse_chan_ops类型,定义在fuse_lowlevel.h中。
但是无法得知receive函数定义在哪,这需要追中ch及op在哪里被赋值。
追踪:
1. ch 在fuse_chan_recv(fuse_session.c)中没有被修改,因此其值从fuse_ll_receive_buf(fuse_lowlevel.c)传递来.
2. 在fuse_ll_receive_buf中仍然没有被修改。
此处发现,struct fuse_session在fuse_i.h中声明,在fuse_lowlevel.c中给其成员函数指针赋值。
因此,值从fuse_session_receive_buf(fuse_session.c )中传来。
3. fuse_session_receive_buf是被fuse_do_work(fuse_loop_mt.c )调用的。
以上是关于后台while收发过程的主要内容,如果未能解决你的问题,请参考以下文章