0

リモート pid が登録され"local pid""its node"名前がmnesiaテーブルに登録されました。別のノードの pid が上記"local pid<0.xxx.xxx>"とノード名をフェッチする場合、 に変換する方法remote pid<xxx.xxx.xxx>

4

1 に答える 1

4

なぜ特別なことをしなければならないのか、まったくわかりません。ここでは、mnesia テーブルを作成し、それぞれのノードから pidl@renatr@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@renatr@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 は特定のノード上の特定のプロセスを参照するため、変換しようとしても意味がありません。これはアトミック データ型です。また、変換できたとしても、実際にどのプロセスを参照するのかはわかりません。

于 2012-11-24T15:04:17.060 に答える