给出本地pid和节点名称,如何转换为远程pid?

时间:2012-11-24 08:13:34

标签: erlang

远程pid注册其"local pid""its node"名称已注册到mnesia表中。如果其他节点的pid获取上述"local pid<0.xxx.xxx>"和节点名称,则如何转换为remote pid<xxx.xxx.xxx>

1 个答案:

答案 0 :(得分:4)

我真的没有看到为什么你必须做任何特别的事情。在这里,我将创建一个在l@renatr@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是指特定节点上的特定进程,因此尝试转换它没有任何意义。它是原子数据类型。即使你可以转换它,你也不知道它实际上会引用什么过程,如果有的话。