欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

erlang判断内部pid的方法

程序员文章站 2022-05-26 10:22:31
...
在erl_term.h文件里:
#define _TAG_IMMED1_PID		((0x0 << _TAG_PRIMARY_SIZE) | TAG_PRIMARY_IMMED1)

#define _TAG_PRIMARY_SIZE	2
#define TAG_PRIMARY_IMMED1	0x3

由上面得到_TAG_IMMED1_PID=0x3(0000 0000 0000 0000 0000 0000 0000 0011)

而判断是否是内部pid的定义是:
#define is_internal_pid(x)	(((x) & _TAG_IMMED1_MASK) == _TAG_IMMED1_PID)


(x) & _TAG_IMMED1_MASK

是将pid的前28位置零,即:

引用
nnnn nnnn nnnn nnnn nnnn nnnn nnnn xxxx

变成
引用
0000 0000 0000 0000 0000 0000 0000 xxxx

最后比较两边是否相等,即xxxx=0011。
总结:
宏is_internal_pid通过判断pid的后4位是不是0011,如果是的话,就是内部pid,否则不是。

在erts/emulator/beam/erl_term.h文件里,有如下的pid格式定义:
引用

/*
*  PID layout (internal pids):
*
*   |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1    |               |
*   |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0|
*   |               |               |               |               |
*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*   |n n n n n n n n n n n n n n n n n n n n n n n n n n n n|0 0|1 1|
*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
*  n : number
*
*  Old pid layout:
*
*   |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1    |               |
*   |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0|
*   |               |               |               |               |
*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*   |s s s|n n n n n n n n n n n n n n n|N N N N N N N N|c c|0 0|1 1|
*   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
*  s : serial
*  n : number
*  c : creation
*  N : node number
*
*/

pid为3683,二进制表示为
0000 0000 0000 0000 0000 1110 0110 0011,
去掉tag(即后四位),则为
0000 0000 0000 0000 0000 1110 0110,
换算成十进制则为230,则外部表示则为<0.230.0>;
相关标签: erlang pid