`
cryolite
  • 浏览: 574050 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

节点与模块

阅读更多
一、节点的启动和连接

测试环境中,节点的启动,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').



二、在所有连接的节点上装载指定的程序模块

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

通过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))]).
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics