2013-05-29 39 views
2

如何將Erlang VM更改爲對其某個pid值使用隨機128位值?修改Erlang VM 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; 
} 

回答

5

爲什麼你想這樣做?創建一個pid並不能保證這個pid有一個進程,或者那個進程將會是一個有pid的進程,只有從spawn得到的返回才能確保這個進程。閱讀Can someone explain the structure of a Pid in Erlang?的答案以獲得各個領域的意義。這將有助於解釋爲什麼你不能將其設置爲任何值。

當您使用'+ P編號'選項啓動erlang時,您可以設置進程表的大小。這給出了第二個字段的最大值。

編輯:關於這個問題和下面的評論只是一些更多的意見。

請注意,進程標識符pid只是一個參考,它不是進程本身。當你在一個進程中獲得一個新進程和一個引用它的新進程時,當您在shell中使用pid/3或使用list_to_pid/1創建一個pid時,您只會得到一個pid,它可能指向或不指向某個進程。

今天沒有辦法在BEAM中控制創建進程時獲得的pid。如果你真的需要這個功能,你將不得不在內部修改BEAM來做到這一點。考慮到BEAM是內部構建的(有一個進程表),以及如何構建一個pid,這可能非常困難。例如,pid中的一個字段是進程表中進程的索引,因此使用相同的表索引來訪問不同的pid是非法的。

不是一個更好的解決方案,而是創建一個標識符/ pid表嗎?

+0

我想用包含隨機128位值的pid創建一個進程。這樣我就可以將它用作一種能力。 http://en.wikipedia.org/wiki/Capability-based_security –

+0

@EricdesCourtis當你創建一個你無法控制它擁有哪個pid的進程時,系統將採用「下一個」免費的進程。所有你可以肯定的是它是獨一無二的。 – rvirding

+0

瞭解,但我的問題是具體如何修改Beam虛擬機來獲取此屬性。 –