erlang判断内部pid的方法

在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)