<div dir="ltr">Hi,<div><br></div><div>The first number in a pid identifies the node. The local node is always 0, remote nodes get some number assigned by the VM. This node number may differ across VM-s. So for example you can have 3 nodes in a cluster, a@localhost, b@localhost and c@localhost. You spawn a process on a@localhost and get back pid <0.123.456>. If you send this pid value to processes on b@localhost and c@localhost and print it there, they may look different in the first number. You can get something like <987.123.456> and <654.123.456> or whatever. In this example b@localhost assigned the number 987 to a@localhost. You can't tell just from looking at the pid <987.123.456> that 987 means a@localhost. But you can be sure that all processes with the same first number come from the same node.</div><div><br></div><div>When you call binary_to_term/1 on a pid, Erlang encodes much more information in the result than what you see in the printed form of a pid: <a href="http://erlang.org/doc/apps/erts/erl_ext_dist.html#new_pid_ext">http://erlang.org/doc/apps/erts/erl_ext_dist.html#new_pid_ext</a> Notably it will include the full name of the node, not just this number we've seen so far. So if you send this binary to a different node it will be able to decode it properly.</div><div><br></div><div>I'm not 100% sure why Pid and Pid1 became different in your example. But I suspect because of the creation value. The creation value is also in the binary_to_term/1 output. It is meant to distinguish pids from different runs of the node with the same name. Local pids are generated somewhat deterministically, so for example the init process is always <0.1.0>, and processes spawned during the boot up also usually get the same pids - or at least identical looking pids in the shell. In fact, whenever the node boots up, it changes its creation value, so if a node crashes and gets restarted the new init process will have a different pid from the last one. Although both of them will look <0.1.0> for you in the shell. But this means list_to_pid/1 doesn't get the real creation value, it has to use some default instead. I guess that's why <9172.91.0> =/= <9172.91.0> for you.</div><div><br></div><div>Cheers,</div><div>Daniel</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, 20 Jun 2020 at 08:28, Yao Bao <<a href="mailto:by@meetlost.com">by@meetlost.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="overflow-wrap: break-word;">Hi,<br><br>By accident, I found erlang:list_to_pid/1 does not produce the same "thing" when putting remote pid string as the argument.<br><br>And, I found this mailing list post: <a href="http://erlang.org/pipermail/erlang-questions/2009-February/042100.html" target="_blank">http://erlang.org/pipermail/erlang-questions/2009-February/042100.html</a><div><br><div>Quite interesting, but I still can't figure out why after reading the whole post.<br><br>I checked the source code, a function called list_to_pid_1() in erts/emulator/beam/bif.c handles this. Honestly speaking, I can't fully understand it. So I did some guess work.<br><br>I wrote a simple module:<div><br>%%<br>%% A dist demo.<br>%%<br>-module(a_dist_demo).<br><br>-export([start/1, loop/0]).<br><br>start(Node) -><br>    spawn(Node, fun() -> loop() end).<br><br>loop() -><br>    receive<br>    {From, {echo, Any}} -><br>        From ! Any,<br>        loop()<br>    end.<br><br><div>And two nodes get started:</div><div><br></div></div><div><div>MacBookPro:code by$ erl -name yao1</div><div>Erlang/OTP 22 [erts-10.5.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]</div><div>Eshell V10.5.3  (abort with ^G)</div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)1> Pid = a_dist_demo:start('<a href="mailto:yao2@MacBookPro.local" target="_blank">yao2@MacBookPro.local</a>').</div><div><9172.91.0></div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)2> Bin = erlang:term_to_binary(Pid).</div><div><<131,103,100,0,21,121,97,111,50,64,77,97,99,66,111,111,</div><div>  107,80,114,111,46,108,111,99,97,108,0,0,0,...>></div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)3> io:format("~p~n", [Bin]).</div><div><<131,103,100,0,21,121,97,111,50,64,77,97,99,66,111,111,107,80,114,111,46,108,</div><div>  111,99,97,108,0,0,0,91,0,0,0,0,2>></div><div>ok</div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)4> Pid ! {self(), {echo, abcd}}.</div><div>{<0.87.0>,{echo,abcd}}</div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)5> receive X -> X end.</div><div>abcd</div></div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)6></div><div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)8> Pid1 = erlang:list_to_pid("<9172.91.0>").</div><div><9172.91.0></div></div><div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)9> Pid = Pid1.</div><div>** exception error: no match of right hand side value <9172.91.0></div></div><div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)11> Bin1 = erlang:term_to_binary(Pid1).</div><div><<131,103,100,0,21,121,97,111,50,64,77,97,99,66,111,111,</div><div>  107,80,114,111,46,108,111,99,97,108,0,0,0,…>></div></div><div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)12> Bin = Bin1.</div><div>** exception error: no match of right hand side value </div><div>                    <<131,103,100,0,21,121,97,111,50,64,77,97,99,66,111,111,</div><div>                      107,80,114,111,46,108,111,99,97,108,0,0,0,...>></div><div>(<a href="mailto:yao1@MacBookPro.local" target="_blank">yao1@MacBookPro.local</a>)13></div></div><div><br></div><div><div>MacBookPro:code by$ erl -name yao2</div><div>Erlang/OTP 22 [erts-10.5.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]</div><div>Eshell V10.5.3  (abort with ^G)</div><div>(<a href="mailto:yao2@MacBookPro.local" target="_blank">yao2@MacBookPro.local</a>)1> Bin = <<131,103,100,0,21,121,97,111,50,64,77,97,99,66,111,111,107,80,114,111,46,108,111,99,97,108,0,0,0,91,0,0,0,0,2>>.</div><div><<131,103,100,0,21,121,97,111,50,64,77,97,99,66,111,111,</div><div>  107,80,114,111,46,108,111,99,97,108,0,0,0,...>></div><div>(<a href="mailto:yao2@MacBookPro.local" target="_blank">yao2@MacBookPro.local</a>)2> Pid = erlang:binary_to_term(Bin).</div><div><0.91.0></div><div>(<a href="mailto:yao2@MacBookPro.local" target="_blank">yao2@MacBookPro.local</a>)3> Pid ! {self(), {echo, 1234}}.</div><div>{<0.87.0>,{echo,1234}}</div><div>(<a href="mailto:yao2@MacBookPro.local" target="_blank">yao2@MacBookPro.local</a>)4> receive X -> X end.</div><div>1234</div><div>(<a href="mailto:yao2@MacBookPro.local" target="_blank">yao2@MacBookPro.local</a>)5></div></div><div><br></div><div>The result is: the same binary produces two different shapes of pid ( <9172.91.0> and <0.91.0> ) in two nodes. Apparently, they refer to the same process.</div><div><br></div><div>I guess the remote pid need some unique information came from the remote node, and erlang:list_to_pid/1 just do not have those information.</div><div><br></div><div>I hope some internal thoughts can be revealed for this.</div><div><br></div><div>Cheers,</div><div>Yao</div><div><br></div></div></div></div></blockquote></div>