节点与模块

[size=x-large]一、节点的启动和连接[/size]

测试环境中,节点的启动,longname风格,cookie为abc

$ erl -name node1@10.0.0.11 -setcookie abc


$ erl -name node2@10.0.0.22 -setcookie abc


节点间的连接,

(node2@10.0.0.22)1> net_kernel:connect_node('node1@10.0.0.11').

或者

(node2@10.0.0.22)1> net_adm:ping('node1@10.0.0.11').



[size=x-large]二、在所有连接的节点上装载指定的程序模块[/size]

要解决的问题是:在一台机器上编译的模块如何加载到其它机器的节点上。

通过c模块中的nl函数实现,如下
c:nl(Module) -> void()
Load module on all nodes.

使用nl可以将模块远程装载到其它的节点上,即使那些节点没有此模块的代码

io模块中也有一个nl函数,不过该函数表示写一个new line
io_lib模块中也有一个nl,含义同上

注意:c模块代表命令接口(Command Interface)的意思;该模块的文档称:该模块中的函数仅用于在Erlang shell中使用,使用时模块名前缀可以省去

查nl源码如下:

nl(Mod) ->
case code:get_object_code(Mod) of
{_Module, BeamBinary, Fname} ->
rpc:eval_everywhere(code,load_binary,[Mod,Fname,BeamBinary]);
Other ->
Other
end.


rpc:eval_everywhere(code,load_binary,[Mod,Fname,BeamBinary])最终执行
eval_everywhere([node()|nodes()], Module, Function, Args)
也就是说在[node()|nodes()]的节点列表中的每个节点上执行code:load_binary(Mode, Fname, Bin)

code:get_object_code(Module) -> {Module, Binary, Filename} | error
此函数在code path中模块Module的二进制目标代码。Binary是包含此模块目标代码的二进制数据对象,如果要在分布式系统中远程装载代码,例如在远程节点Node中装载模块Module可以这样:
...       
{_Module, BeamBinary, Filename} = code:get_object_code(Module),
rpc:call(Node, code, load_binary, [Module, Filename, BeamBinary]),
...


其它
查看,编译好的beam目标文件的源代码
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(BeamBinary,[abstract_code]).
io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
阅读更多
文章标签: Erlang C C++ C# .net
个人分类: Erlang 我的备忘录
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭