【问题标题】:Modifying Erlang VM Pid修改 Erlang VM Pid
【发布时间】:2013-05-25 08:11:15
【问题描述】:

如何更改 Erlang VM 以使用随机 128 位值作为其 pid 值之一?

看来此时我能设置的最大值是:

32> pid(1, 32767, 8191).
** exception error: bad argument
     in function  list_to_pid/1
        called as list_to_pid("<1.32767.8191>")
     in call from c:pid/3 (c.erl, line 419)
33> pid(0, 32767, 8191).
<0.32767.8191>

看起来 pid 的生成归结为 erts/emulator/beam/erl_ptab.h:283 中的类似内容:

ERTS_GLB_INLINE Eterm
erts_ptab_make_id(ErtsPTab *ptab, Eterm data, Eterm tag)
{
    HUint huint;
    Uint32 low_data = (Uint32) data;
    low_data &= (1 << ERTS_PTAB_ID_DATA_SIZE) - 1;
    low_data <<= ERTS_PTAB_ID_DATA_SHIFT;
    huint.hval[ERTS_HUINT_HVAL_HIGH] = erts_ptab_data2pix(ptab, data);
    huint.hval[ERTS_HUINT_HVAL_LOW] = low_data | ((Uint32) tag);
    return (Eterm) huint.val;
}

【问题讨论】:

    标签: c erlang pid vm-implementation beam


    【解决方案1】:

    为什么要这样做?创建 pid 并不能保证存在具有该 pid 的进程,或者将永远是具有该 pid 的进程,只有来自 spawn 的返回可以确保这一点。阅读Can someone explain the structure of a Pid in Erlang? 的答案以了解各个字段的含义。这将有助于解释为什么您不能将其设置为任何值。

    您可以在启动 erlang 时使用 '+P Number' 选项设置进程表的大小。这给出了第二个字段的最大值。

    编辑:关于这个问题的更多 cmets 和下面的 cmets。

    请注意,进程标识符(进程标识符)只是进程的引用,它不是进程本身。当您 spawn 一个进程时,您会同时获得一个新进程和一个引用它的新 pid。当您在 shell 中使用 pid/3 或使用 list_to_pid/1 创建 pid 时,您只会得到一个可能引用或不引用进程的 pid。

    如今,BEAM 无法控制您在创建进程时获得的 pid。如果你真的需要这个功能,你将不得不在内部修改 BEAM 来做到这一点。考虑到 BEAM 是内部结构的(带有进程表)以及 pid 的结构方式,这可能很难做到。例如,pid 中的一个字段是进程表中进程的索引,因此具有相同表索引的不同 pid 是非法的。

    不是更好的解决方案是创建一个标识符/pid 表吗?

    【讨论】:

    • 我想创建一个 pid 包含随机 128 位值的进程。这样我就可以将它用作一种能力。 en.wikipedia.org/wiki/Capability-based_security
    • @EricdesCourtis 当您创建一个进程时,您无法控制它拥有哪个 pid,系统会采用“下一个”空闲进程。你可以肯定的是它是独一无二的。
    • 第二个问题很容易回答:只是普遍不信任并且不想将任何东西直接连接到互联网。此外,BEAM 是完全不安全的,因为一旦您进入您就可以做任何事情,它被设计为在防火墙后面使用,您只能让受信任的系统直接访问而不控制它们的操作。
    • 对于第一个问题,我只想说 pid 的结构和字段直接反映了进程的内部处理,例如节点字段、进程表字段的索引和计数器字段。
    • 那我得检查一下它到底是什么意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2011-03-10
    • 2012-09-30
    • 2015-08-02
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    相关资源
    最近更新 更多