有人可以解释Erlang中Pid的结构吗?有人可以解释Erlang中Pid的结构吗?
Pids看起来像这样:<A.B.C>
,例如, < 0.30.0>,但是我想知道这三个“比特”是什么意思:A,B和C.
'A'在本地节点上似乎总是为0,但是这个值会改变当Pid的所有者位于另一个节点时。
是否可以直接使用Pid在远程节点上发送消息?类似的东西:< 4568.30.0>!消息,而不必明确指定注册过程的名称和节点名称({proc_name,Node}!消息)?
有人可以解释Erlang中Pid的结构吗?有人可以解释Erlang中Pid的结构吗?
Pids看起来像这样:<A.B.C>
,例如, < 0.30.0>,但是我想知道这三个“比特”是什么意思:A,B和C.
'A'在本地节点上似乎总是为0,但是这个值会改变当Pid的所有者位于另一个节点时。
是否可以直接使用Pid在远程节点上发送消息?类似的东西:< 4568.30.0>!消息,而不必明确指定注册过程的名称和节点名称({proc_name,Node}!消息)?
印刷进程ID < ABC>由的6:
在内部,进程号在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 structure, Node creation information, Node creation counter interaction with EPMD
PID是指进程和节点表。因此,只有在您进行呼叫的节点中知道PID时,才能直接向PID发送消息。
如果您已经在运行进程的节点已经调用的节点knows about,这可能会起作用。
如果我正确记住这个格式是<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
你有没有看过这个大红色警告? [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
是的..了解这些其他方法。这就是我使用的。 这只是不是问题。 :) – 2009-01-17 18:53:46
进程ID < ABC>的组成:
2位的创建标记不显示在pid中,而是在内部使用,每次节点重新启动时都会增加。
除了其他人所说,你会发现这个简单的实验来了解什么是内部发生了有用:
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。
好吧,我的主要问题是固定的。我只是没有发送好的pid到远程端... – jideel 2008-11-04 09:44:05