如何连接到使用短名称的Erlang节点?

时间:2014-03-05 15:36:57

标签: erlang

当我运行erl -sname foo时,创建的节点名称使用主机名而不是“localhost”,因此它被生成为例如foo@roger-pc

然后我register(shell, self()),我可以从另一个节点(erl -sname bar)向其发送消息,如下所示:

{shell, 'foo@roger-pc'} ! {hello, world}.

但是如果我使用{shell, foo} ! {knock, knock}则无效。永远不会收到该消息。

如何连接到使用短名称的同一台PC上的Erlang节点?或者:如何导出目标节点名称的“@ roger-pc”部分?或者:我应该使用erl -name foo@localhost来注册长名吗?

一些背景知识:我正在写一个生成erl进程的escript,我希望能够将该操作系统进程的消息发送回原始脚本。

3 个答案:

答案 0 :(得分:8)

您可以为sname明确指定“localhost”。

第一个shell

erl -sname ax@localhost
register(rcvr, self()).

第二个shell

erl -sname bx@localhost
net_kernel:connect_node(ax@localhost).
{rcvr, ax@localhost} ! hello.

再次发布第一个shell

(ax@localhost)7> flush().
Shell got hello
ok

答案 1 :(得分:0)

sname仍需要'@'表示法。您只需在发送消息时输入完整的uri即可。

c:\>erl -sname short
(short@hostname)1> {process, 'short@hostname'} ! Message.

c:\>erl -name short
(short@hostname.more.stuff)1> {process, 'short@hostname.more.stuff'} ! Message.

简称不是全名。 sname和name只决定需要多少其余的路径。

答案 2 :(得分:-2)

  

节点是一个正在执行的Erlang运行时系统,它使用命令行flag -name(长名称)或-sname(短名称)命名。

节点名称的格式是原子名称@ host,其中name是用户指定的名称,如果使用长名称,host是完整的主机名,如果使用短名称,则是主机名的第一部分。 node()返回节点的名称。例如:

%erl -name dilbert (dilbert@uab.ericsson.se)1>节点()。 'dilbert@uab.ericsson.se'

%erl -sname dilbert (迪尔伯特@ UAB)1>节点()。 迪尔伯特@ UAB