Frage

Kann jemand die Struktur eines Pid in Erlang erklären?

Pids sieht wie folgt aus: <A.B.C> , z.B. <0.30.0>, aber ich möchte wissen, was die Bedeutung dieser drei "Bits":. A, B und C

‚A‘ scheint immer 0 auf einem lokalen Knoten zu sein, aber dieser Wert ändert sich, wenn die Pid des Besitzers auf einem anderen Knoten befindet.

Ist es möglich, direkt eine Nachricht auf einem entfernten Knoten nur die Pid mit schicken? Etwas wie folgt aus: <4568.30.0>! Nachricht, ohne explizit mit, um den Namen des registrierten Vorgangs angeben und die Knotennamen ({proc_name, Knoten}! Nachricht)?

War es hilfreich?

Lösung

Druck Prozess-IDs besteht aus 6 :

  • A, die Knotennummer (0 ist die lokale Knoten, eine beliebige Zahl für einen Remote-Knoten)
  • B, wobei die ersten 15 Bits der Prozeßnummer (ein Index in der Prozesstabelle) 7
  • C, die Bits 16-18 der Prozeßnummer (die gleiche Prozessnummer als B) 7

Intern wird die Prozessnummer ist 28 Bit breit auf dem 32-Bit-Emulator. Die ungerade Definition von B und C kommt aus R9B und früheren Versionen von Erlang in denen B ein 15Bit-Prozess-ID war, und C war ein Wrap-Zähler inkrementiert, wenn der Prozess-ID max erreicht wurde und unteren IDs wurden wieder verwendet.

In der Erlang-Verteilung PIDs sind ein wenig größer, als sie den Knoten Atom sowie die anderen Informationen enthalten. ( Distributed PID-Format )

Wenn ein interner PID von einem Knoten zum anderen gesendet wird, wird es automatisch auf die externe / verteilte PID Form umgewandelt, so was könnte auf einem Knoten <0.10.0> (inet_db) könnte sich als <2265.10.0> enden, wenn auf einen anderen Knoten gesendet. Sie können nur auf diese PIDs als normal senden.

% 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()]). 

Weitere Informationen finden Sie unter: Internal PID-Struktur , Knoten Erstellungsinformationen , Knoten Erstellung Zähler Interaktion mit EPMD

Andere Tipps

Wenn ich das richtig das Format erinnern ist <nodeid,serial,creation>. 0 aktuelle Knoten ähnlich wie ein Computer hat immer den Hostnamen „localhost“ auf sich selbst zu beziehen. Dies ist durch alten Speicher, so dass es nicht 100% richtig hart sein könnte.

Aber ja. Sie können die pid mit list_to_pid/1 zum Beispiel bauen.

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

Natürlich. Sie verwenden nur welche Methode Sie Ihr PidString bauen verwenden müssen. Wahrscheinlich schreibt eine Funktion, die es verwendet, dass anstelle von PidString wie so erzeugt:

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

Prozess-ID besteht aus:

  • A, Knoten-ID, die nicht willkürlich, sondern der interne Index für diesen Knoten in dist_entry ist. (Es ist tatsächlich das Atom Schlitz ganze Zahl für die Knotennamen.)
  • B, Prozessindex, der in der proctab auf den internen Index bezieht, (0 -> maxprocs)
  • .
  • C, Seriell, die jedes Mal maxprocs erhöht wird erreicht.

Die Schaffung Tag von 2 Bits nicht im pid angezeigt, sondern wird intern verwendet und erhöht Neustart jedesmal, wenn der Knoten.

Die PID bezieht sich auf ein Verfahren und eine Knotentabelle. So können Sie nur eine Nachricht direkt an einen PID senden, wenn es in dem Knoten bekannt ist, von dem Sie den Anruf zu tun.

Es ist möglich, dass dies funktionieren wird, wenn der Knoten Sie den Anruf nicht von bereits weiß etwa dem Knoten, auf dem der Prozess läuft.

Neben was andere gesagt haben, können Sie dieses einfache Experiment nützlich zu verstehen, das finden, was intern vor sich geht:

1> node().
nonode@nohost
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>>

So können Sie se, dass der Knotenname intern in der pid gespeichert ist. Weitere Informationen in rel="nofollow"> Sie Some Erlang von Lernen.

scroll top