当我运行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,我希望能够将该操作系统进程的消息发送回原始脚本。
答案 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