node() コマンドを実行すると、ノードの pid が取得されます。同じノードにいる場合は <0.X.0> の形式で、他のノードから同じコマンドを実行すると < XY0> の形式の結果が得られます。同じノードの < XY0> から値 X を取得する方法を知りたいです。
2 に答える
pidのノード部分の整数値またはノードの名前を意味しますか。名前には、node/1
そのpidが参照するノードの名前を返すBIFがあります。それで
node(self()) ==> 'mynode@my_host.com'
node(RemotePid) ==> 'remote_node@remote_host.com'
また、ノード固有のポートと参照に対しても機能します。最初のフィールドの値は常に0
現在のノードのものであり、値はリモートノードごとに異なります。同じリモートノードへの参照の値は、ノードごとに異なります。
注意:pidの表現が<X.Y.Z>
実際に何を意味するかは定義されていないので、あまり依存しないでください。変わる可能性は低いですが。
これは絶対に腑に落ちません。<0.X.0>
はあなたのローカルPid
、<D.X.0>
- 分散バリアントで、D
はノードの番号です。Pid strcuture に関する詳細情報。ただし、D
ノードごとに異なります。したがって、ローカルではこの情報を取得できません。
もちろん、呼び出し元に彼の (呼び出し元の) 分散 Pid を返す特別な RPC 呼び出しを実装できます。しかし、結果は答えが異なります。これを確実にするために、簡単に試してください:
3 つの異なるノードを起動し、 として登録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
2番
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
ノード1に戻り、試してください。
(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>
.