5

node() コマンドを実行すると、ノードの pid が取得されます。同じノードにいる場合は <0.X.0> の形式で、他のノードから同じコマンドを実行すると < XY0> の形式の結果が得られます。同じノードの < XY0> から値 X を取得する方法を知りたいです。

4

2 に答える 2

3

pidのノード部分の整数値またはノードの名前を意味しますか。名前には、node/1そのpidが参照するノードの名前を返すBIFがあります。それで

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

また、ノード固有のポートと参照に対しても機能します。最初のフィールドの値は常に0現在のノードのものであり、値はリモートノードごとに異なります。同じリモートノードへの参照の値は、ノードごとに異なります。

注意:pidの表現が<X.Y.Z>実際に何を意味するかは定義されていないので、あまり依存しないでください。変わる可能性は低いですが。

于 2012-09-01T20:56:13.753 に答える
2

これは絶対に腑に落ちません。<0.X.0>はあなたのローカルPid<D.X.0>- 分散バリアントで、Dはノードの番号です。Pid strcuture に関する詳細情報。ただし、Dノードごとに異なります。したがって、ローカルではこの情報を取得できません。

もちろん、呼び出し元に彼の (呼び出し元の) 分散 Pid を返す特別な RPC 呼び出しを実装できます。しかし、結果は答えが異なります。これを確実にするために、簡単に試してください:

3 つの異なるノードを起動し、 として登録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

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>.

于 2012-09-01T16:58:01.967 に答える