erlang - 有人可以解释一下 Erlang 中 Pid(进程标识符)的结构吗?

标签 erlang pid

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

Pids 看起来像这样: <A.B.C> ,例如<0.30.0> ,但我想知道这三个“位”的含义是什么: ABC

A 在本地节点上似乎总是 0,但是当 Pid 的所有者位于另一个节点上时,该值会发生变化。

是否可以仅使用 Pid 直接在远程节点上发送消息?像这样的东西: <4568.30.0> ! Message ,而不必显式指定注册进程的名称和节点名称( {proc_name, Node} ! Message )?

最佳答案

打印的进程 ID < A.B.C > 由 6 组成:

  • A,节点号(0为本地 节点,任意数量的远程节点)
  • B,进程号的前 15 位(进程表的索引)7
  • C,进程号的第 16-18 位(与 B 相同的进程号)7

在内部,32 位仿真器上的进程号为 28 位宽。 B 和 C 的奇怪定义来自 R9B 和 Erlang 的早期版本,其中 B 是 15 位进程 ID,C 是当达到最大进程 ID 并重用较低 ID 时递增的换行计数器。

在 erlang 发行版中,PID 稍大一些,因为它们包含节点原子以及其他信息。 (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

关于erlang - 有人可以解释一下 Erlang 中 Pid(进程标识符)的结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/243363/

相关文章:

erlang - `receive after 0` 的用途(也称为选择性接收)

python - 使用pid在python中杀死子进程

子进程打印错误的 ppid()

c++ - 按名称返回 PID

php - 如何在php中找到PID

function - Erlang 模式与函数匹配

Erlang gen_tcp 是累积接收到的数据

exception - Erlang 中的 function_clause 和 badarg 有什么区别?

使用 mochiweb 对列表进行 JSON 编码