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位置零,即:

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

在erts/emulator/beam/erl_term.h文件里,有如下的pid格式定义:
[quote]
/*
* 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|[color=red]0 0|1 1[/color]|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* 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
*
*/
[/quote]
pid为3683,二进制表示为
0000 0000 0000 0000 0000 1110 0110 0011,
去掉tag(即后四位),则为
0000 0000 0000 0000 0000 1110 0110,
换算成十进制则为230,则外部表示则为<0.230.0>;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值