gen_server: handle_cast VS handle_info

http://www.trapexit.org/forum/viewtopic.php?p=44427

fuserlsrv采用gen_server behaviour,它是open_port的控制进程。

对从port来的消息,由fuserlsrv的回调函数handle_info处理,这里没有一个explicit request operation, 而是有gen_server自己进行消息派遣。

fuserldrv  ----> port   ----> fuserlsrv ----> Module:handle_info

handle_call处理显式调用gen_server:call产生的消息,同样,handle_cast处理显式调用gen_server:cast所产生的消息。不同的是,前者是同步的,后者是异步的。

详情可以参考gen_server的源码,也可以根据trace技术来了解程序的运行情况。Erlang在这些方面做的比较到位。

如此看来,fuserl的整个流程就比较清楚了。
首先mount fuse文件系统
后续针对该文件系统的所有操作,经过VFS机制,在fuse kernel module的辅助下,转到用户空间的fuserldrv进程(libfuse)。
fuserldrv把相应的请求通过fd 4发给port的控制进程,即fuserlsrv。


猜你喜欢

转载自ecloud.iteye.com/blog/599054