远程pid注册其"local pid"
,"its node"
名称已注册到mnesia
表中。如果其他节点的pid获取上述"local pid<0.xxx.xxx>"
和节点名称,则如何转换为remote pid<xxx.xxx.xxx>
。
答案 0 :(得分:4)
我真的没有看到为什么你必须做任何特别的事情。在这里,我将创建一个在l@renat
和r@renat
上运行的mnesia表,并从各个节点写入和读取pid并显示它们不需要“转换”pid作为Erlang的分发机制自动< / strong>照顾它。让它全部工作将会有点长。
首先在节点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
在节点l@renat
上,我们创建一个表并插入一个包含本地(到l@renat
)pid的条目:
(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是指另一个节点(),节点l@renat
上的进程。然后我们在包含本地(到r@renat
)pid的表中添加了一条记录。如果我们然后在节点l@renat
上读取该记录,我们会看到它包含节点r@renat
上的进程的pid:
(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是指特定节点上的特定进程,因此尝试转换它没有任何意义。它是原子数据类型。即使你可以转换它,你也不知道它实际上会引用什么过程,如果有的话。