节点与模块

[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))]).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值