如何知道erlang中节点的id

use*_*672 5 erlang pid

当我们运行 node() 命令时,我们会得到节点的 pid。格式 <0.X.0> 如果我们在同一个节点上,并且当我们从其他节点运行相同的命令时得到 <XY0> 形式的结果。我想知道如何从同一节点上的 < XY0> 获取值 X。

Ale*_*yev 2

这绝对没有道理。<0.X.0>是您的本地Pid, <D.X.0>- 分布式变体,其中D是节点号。有关 Pid 结构的更多信息。但D对于不同的节点会有所不同。所以在本地你无法获取这些信息。

当然,您可以实现特殊的 RPC 调用,它将返回给调用者他(调用者)的分布式 Pid。但结果会有所不同。为了确保这一点,请尝试简单的操作:

启动三个不同的节点并注册shellself.

第一的

erl -sname one
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
(one@Alexeys-MacBook-Pro)1> node().
'one@Alexeys-MacBook-Pro'
(one@Alexeys-MacBook-Pro)2> register(shell, self()).
true
Run Code Online (Sandbox Code Playgroud)

第二

erl -sname two
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
(two@Alexeys-MacBook-Pro)1> node().
'two@Alexeys-MacBook-Pro'
(two@Alexeys-MacBook-Pro)2> register(shell, self()).
true
Run Code Online (Sandbox Code Playgroud)

第三

erl -sname three
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
(three@Alexeys-MacBook-Pro)1> node().
'three@Alexeys-MacBook-Pro'
(three@Alexeys-MacBook-Pro)2> register(shell, self()).
true
Run Code Online (Sandbox Code Playgroud)

现在返回到节点,然后尝试

(one@Alexeys-MacBook-Pro)6> net_kernel:connect('two@Alexeys-MacBook-Pro').
true
(one@Alexeys-MacBook-Pro)7> net_kernel:connect('threeAlexeys-MacBook-Pro').
true
(one@Alexeys-MacBook-Pro)8> {shell, 'two@Alexeys-MacBook-Pro'} ! {hello, from, self()}.  
{hello,from,<0.147.0>}
(one@Alexeys-MacBook-Pro)82> {shell, 'three@Alexeys-MacBook-Pro'} ! {hello, from, self()}.  
{hello,from,<0.147.0>}
Run Code Online (Sandbox Code Playgroud)

检查节点二的结果

(two@Alexeys-MacBook-Pro)3> flush().
Shell got {hello,from,<6767.147.0>}
ok
Run Code Online (Sandbox Code Playgroud)

(three@Alexeys-MacBook-Pro)3> flush().
Shell got {hello,from,<6803.147.0>}
ok
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Pid 的第一部分不同:<6767.147.0><6803.147.0>