如何知道erlang中节点的id

时间:2012-09-01 15:15:25

标签: erlang pid

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

2 个答案:

答案 0 :(得分:2)

这绝对不会让人产生感觉。 <0.X.0>是您的本地Pid<D.X.0> - 分布式变体,其中D是节点的编号。 More information about Pid strcuture。但D对于不同的节点会有所不同。所以在本地你无法获得这些信息。

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

启动三个不同的节点并将shell注册为self

第一

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

第二

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

第三

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

现在返回节点一个,然后尝试

(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>}

检查节点 2

上的结果
(two@Alexeys-MacBook-Pro)3> flush().
Shell got {hello,from,<6767.147.0>}
ok

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

如您所见,Pid的第一部分有所不同:<6767.147.0><6803.147.0>

答案 1 :(得分:2)

是指pid的节点部分的整数值还是节点的 name 。对于名称,有BIF node/1,它返回该pid引用的节点的名称。所以

node(self())    ==> 'mynode@my_host.com'
node(RemotePid) ==> 'remote_node@remote_host.com'

它也适用于特定于节点的端口和引用。对于当前节点,第一个字段的值始终为0,并且远程节点的值将有所不同。引用同一远程节点的值在不同节点上会有所不同。

N.B。 pid <X.Y.Z>实际上的含义是什么意思没有定义,所以不要太依赖它。虽然不太可能改变。