2008-10-28 88 views
61

有人可以解释Erlang中Pid的结构吗?有人可以解释Erlang中Pid的结构吗?

Pids看起来像这样:<A.B.C>,例如, < 0.30.0>,但是我想知道这三个“比特”是什么意思:A,B和C.

'A'在本地节点上似乎总是为0,但是这个值会改变当Pid的所有者位于另一个节点时。

是否可以直接使用Pid在远程节点上发送消息?类似的东西:< 4568.30.0>!消息,而不必明确指定注册过程的名称和节点名称({proc_name,Node}!消息)?

+0

好吧,我的主要问题是固定的。我只是没有发送好的pid到远程端... – jideel 2008-11-04 09:44:05

回答

64

印刷进程ID < ABC>由的6

  • A,节点号(0是本地 节点,对于一个远程节点的任意数)
  • B,进程号(索引到处理表)7
  • C的第一15个比特,比特的过程中的16-18编号(与B相同的进程号)7

在内部,进程号在32位模拟器上是28位宽。 B和C的奇怪定义来自R9B和早期版本的Erlang,其中B是15位进程ID,并且C是在达到最大进程ID并且重新使用较低ID时包装计数器递增的。

在erlang分布中,PIDs有点大,因为它们包含节点原子以及其他信息。 (Distributed PID format

当内部PID被从一个节点发送到另一个,它的自动转换到外部/分布PID形式,所以可能是什么<0.10.0>inet_db)上的一个节点可能最终作为<2265.10.0>时发送到另一个节点。您可以照常发送到这些PID。

% get the PID of the user server on OtherNode 
RemoteUser = rpc:call(OtherNode, erlang,whereis,[user]), 

true = is_pid(RemoteUser), 

% send message to remote PID 
RemoteUser ! ignore_this, 

% print "Hello from <nodename>\n" on the remote node's console. 
io:format(RemoteUser, "Hello from ~p~n", [node()]). 

更多信息参见:Internal PID structureNode creation informationNode creation counter interaction with EPMD

2

PID是指进程和节点表。因此,只有在您进行呼叫的节点中知道PID时,才能直接向PID发送消息。

如果您已经在运行进程的节点已经调用的节点knows about,这可能会起作用。

+1

如果我在远程节点上发出“节点()”,我的本地节点出现,但我无法注册“远程pid”,因为list_to_pid失败: “register(client,list_to_pid(”<5058.95.0>“))。”返回“不良论据”。 我错过了什么? – jideel 2008-10-28 14:58:42

+0

您只能注册本地pid - 注册您需要使用全球注册模块的远程pid(或推出您自己的注册系统)。 – archaelus 2009-06-03 22:56:16

13

如果我正确记住这个格式是<nodeid,serial,creation>。 0是当前节点,非常类似于计算机始终具有主机名“localhost”来引用自身。这是由旧的记忆,所以它可能不是100%正确的强硬。

但是。例如,您可以使用list_to_pid/1构建pid。

PidString = "<0.39.0>", 
list_to_pid(PidString) ! message. 

当然。您只需使用您需要的任何方法来构建您的PidString。大概写生成它的功能,并使用该代替PidString像这样:

list_to_pid(make_pid_from_term({proc_name, Node})) ! message 
+0

你有没有看过这个大红色警告? [list_to_pid/1](http://www.erlang.org/doc/man/erlang.html#list_to_pid-1) 而且你也可以直接发送{proc_name,Node}!消息 或使用模块全局,如果你想使用全局名称。 – 2009-01-02 13:44:31

+0

是的..了解这些其他方法。这就是我使用的。 这只是不是问题。 :) – 2009-01-17 18:53:46

7

进程ID < ABC>的组成:

  • A,节点ID是不是任意的,但内部索引为dist_entry中的该节点。 (它实际上是节点名称的原子槽整数)
  • B,引用proctab中内部索引的进程索引(0-> MAXPROCS)。
  • C,串行每次达到MAXPROCS时都会增加。

2位的创建标记不显示在pid中,而是在内部使用,每次节点重新启动时都会增加。

0

除了其他人所说,你会发现这个简单的实验来了解什么是内部发生了有用:

1> node(). 
[email protected] 
2> term_to_binary(node()). 
<<131,100,0,13,110,111,110,111,100,101,64,110,111,104,111, 
    115,116>> 
3> self().     
<0.32.0> 
4> term_to_binary(self()). 
<<131,103,100,0,13,110,111,110,111,100,101,64,110,111,104, 
    111,115,116,0,0,0,32,0,0,0,0,0>> 

所以,你可以本身节点名称存储在内部的PID。了解更多关于Erlang的更多信息,请点击this section

相关问题