2008-10-28 63 views
61

有人可以解釋Erlang中Pid的結構嗎?有人可以解釋Erlang中Pid的結構嗎?

Pids看起來像這樣:<A.B.C>,例如, < 0.30.0>,但是我想知道這三個「比特」是什麼意思:A,B和C.

'A'在本地節點上似乎總是爲0,但是這個值會改變當Pid的所有者位於另一個節點時。

是否可以直接使用Pid在遠程節點上發送消息?類似的東西:< 4568.30.0>!消息,而不必明確指定註冊過程的名稱和節點名稱({proc_name,Node}!消息)?

+0

好吧,我的主要問題是固定的。我只是沒有發送好的pid到遠程端... – jideel 2008-11-04 09:44:05

回答

64

印刷進程ID < ABC>由的6

  • A,節點號(0是本地 節點,對於一個遠程節點的任意數)
  • B,進程號(索引到處理表)7
  • C的第一15個比特,比特的過程中的16-18編號(與B相同的進程號)7

在內部,進程號在32位模擬器上是28位寬。 B和C的奇怪定義來自R9B和早期版本的Erlang,其中B是15位進程ID,並且C是在達到最大進程ID並且重新使用較低ID時包裝計數器遞增的。

在erlang分佈中,PIDs有點大,因爲它們包含節點原子以及其他信息。 (Distributed PID format

當內部PID被從一個節點發送到另一個,它的自動轉換到外部/分佈PID形式,所以可能是什麼<0.10.0>inet_db)上的一個節點可能最終作爲<2265.10.0>時發送到另一個節點。您可以照常發送到這些PID。

% get the PID of the user server on OtherNode 
RemoteUser = rpc:call(OtherNode, erlang,whereis,[user]), 

true = is_pid(RemoteUser), 

% send message to remote PID 
RemoteUser ! ignore_this, 

% print "Hello from <nodename>\n" on the remote node's console. 
io:format(RemoteUser, "Hello from ~p~n", [node()]). 

更多信息參見:Internal PID structureNode creation informationNode creation counter interaction with EPMD

2

PID是指進程和節點表。因此,只有在您進行呼叫的節點中知道PID時,才能直接向PID發送消息。

如果您已經在運行進程的節點已經調用的節點knows about,這可能會起作用。

+1

如果我在遠程節點上發出「節點()」,我的本地節點出現,但我無法註冊「遠程pid」,因爲list_to_pid失敗: 「register(client,list_to_pid(」<5058.95.0>「))。」返回「不良論據」。 我錯過了什麼? – jideel 2008-10-28 14:58:42

+0

您只能註冊本地pid - 註冊您需要使用全球註冊模塊的遠程pid(或推出您自己的註冊系統)。 – archaelus 2009-06-03 22:56:16

13

如果我正確記住這個格式是<nodeid,serial,creation>。 0是當前節點,非常類似於計算機始終具有主機名「localhost」來引用自身。這是由舊的記憶,所以它可能不是100%正確的強硬。

但是。例如,您可以使用list_to_pid/1構建pid。

PidString = "<0.39.0>", 
list_to_pid(PidString) ! message. 

當然。您只需使用您需要的任何方法來構建您的PidString。大概寫生成它的功能,並使用該代替PidString像這樣:

list_to_pid(make_pid_from_term({proc_name, Node})) ! message 
+0

你有沒有看過這個大紅色警告? [list_to_pid/1](http://www.erlang.org/doc/man/erlang.html#list_to_pid-1) 而且你也可以直接發送{proc_name,Node}!消息 或使用模塊全局,如果你想使用全局名稱。 – 2009-01-02 13:44:31

+0

是的..瞭解這些其他方法。這就是我使用的。 這只是不是問題。 :) – 2009-01-17 18:53:46

7

進程ID < ABC>的組成:

  • A,節點ID是不是任意的,但內部索引爲dist_entry中的該節點。 (它實際上是節點名稱的原子槽整數)
  • B,引用proctab中內部索引的進程索引(0-> MAXPROCS)。
  • C,串行每次達到MAXPROCS時都會增加。

2位的創建標記不顯示在pid中,而是在內部使用,每次節點重新啓動時都會增加。

0

除了其他人所說,你會發現這個簡單的實驗來了解什麼是內部發生了有用:

1> node(). 
[email protected] 
2> term_to_binary(node()). 
<<131,100,0,13,110,111,110,111,100,101,64,110,111,104,111, 
    115,116>> 
3> self().     
<0.32.0> 
4> term_to_binary(self()). 
<<131,103,100,0,13,110,111,110,111,100,101,64,110,111,104, 
    111,115,116,0,0,0,32,0,0,0,0,0>> 

所以,你可以本身節點名稱存儲在內部的PID。瞭解更多關於Erlang的更多信息,請點擊this section