0

一个远程 pid 注册了它的名字"local pid",并且"its node"名字已经注册到了mnesia表中。如果另一个节点的 pid 获取上述"local pid<0.xxx.xxx>"和节点名称,如何转换为remote pid<xxx.xxx.xxx>.

4

1 回答 1

4

我真的不明白为什么你必须做任何特别的事情。在这里,我将创建一个 mnesia 表,在各个节点上运行l@renatr@renat写入和读取 pid,并表明它们不需要“转换”pid,因为 Erlang 的分发机制会自动处理它。让这一切正常工作会有点长。

首先在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 指的是另一个 node() node 上的进程l@renat。然后,我们向包含本地(到r@renat)pid 的表添加了一条记录。如果我们然后在 node 上读取该记录,l@renat我们会看到它包含 node 上进程的 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 回答