リモート pid が登録され"local pid"
、"its node"
名前がmnesia
テーブルに登録されました。別のノードの pid が上記"local pid<0.xxx.xxx>"
とノード名をフェッチする場合、 に変換する方法remote pid<xxx.xxx.xxx>
。
1 に答える
なぜ特別なことをしなければならないのか、まったくわかりません。ここでは、mnesia テーブルを作成し、それぞれのノードから pidl@renat
をr@renat
読み書きし、Erlang の分散メカニズムが自動的に処理するため、pid を「変換」する必要がないことを示します。すべてが機能するようになるまでには、少し時間がかかります。
最初にl@renat
接続するノードまたは他のノードで、mnesia スキーマを作成します。
Eshell V5.9.1 (abort with ^G)
(l@renat)1> net_adm:ping(r@renat).
pong
(l@renat)3> mnesia:create_schema([node()|nodes()]).
ok
(l@renat)5> mnesia:start().
ok
ノードr@renat
で mnesia を開始しました。
Eshell V5.9.1 (abort with ^G)
(r@renat)1> mnesia:start().
ok
nodeでテーブルを作成し、ローカル ( to ) pidl@renat
を含むエントリを挿入します。l@renat
(l@renat)6> mnesia:create_table(local, [{attributes,[node,pid]},{ram_copies,[node()|nodes()]}]).
{atomic,ok}
(l@renat)8> mnesia:transaction(fun () -> mnesia:write({local,node(),self()}) end).
{atomic,ok}
レコードを定義していませんが、レコード タプルを明示的に読み書きしていることに注意してください。それは可能ですが、レコードを使用するのが最善です。ノードr@renat
で同じレコードを読み取ることができます。
(r@renat)10> {atomic,[Lr]} = mnesia:transaction(fun () -> mnesia:read(local, l@renat) end).
{atomic,[{local,l@renat,<5893.37.0>}]}
(r@renat)11> node(element(3, Lr)).
l@renat
(r@renat)12> mnesia:transaction(fun () -> mnesia:write({local,node(),self()}) end).
{atomic,ok}
pid が別の node() node のプロセスを参照していることがわかりますl@renat
。r@renat
次に、ローカル (to ) pidを含むテーブルにレコードを追加しました。node でそのレコードを読み取ると、 nodel@renat
のプロセスの pid が含まれていることがわかりますr@renat
。
(l@renat)13> {atomic,[Rp]} = mnesia:transaction(fun () -> mnesia:read(local, r@renat) end).
{atomic,[{local,r@renat,<6007.85.0>}]}
(l@renat)14> node(element(3,Rp)).
r@renat
したがって、「変換」は不要であることがわかります。
実際、いかなる形態の「回心」も実際にはまったく無意味です。pid は特定のノード上の特定のプロセスを参照するため、変換しようとしても意味がありません。これはアトミック データ型です。また、変換できたとしても、実際にどのプロセスを参照するのかはわかりません。