[url]http://www.trapexit.org/forum/viewtopic.php?p=44427[/url]
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。
[img]http://dl.iteye.com/upload/attachment/206765/24abeaf4-7d6d-3292-93e6-3ec69804f437.jpg[/img]
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。
[img]http://dl.iteye.com/upload/attachment/206765/24abeaf4-7d6d-3292-93e6-3ec69804f437.jpg[/img]