This week's LFE Friday was translated with permission from the Erlang Thursday series by Steven Proctor. This week's translator: Robert Virding.

Today's LFE Friday is a short one on c:pid/3.

c:pid/3 takes the three different parts of a pid as its arguments, and returns a constructed Pid type corresponding to those values.

We'll call (self) to get a pid that we know is good, and we can use that to compare the result of calling c:pid/3.

> (self)        
<0.87.0>
> (c:pid 0 87 0)
<0.87.0>
> (=:= (self) (c:pid 0 87 0))
true

Why is this useful? Sometimes when inspecting what is going on in a live system there are certain calls in LFE that expect a pid() type, and not just the pid numbers.

> (c:regs)

** Registered procs on node nonode@nohost **
Name                  Pid          Initial Call                      Reds Msgs
application_controlle <0.7.0>      erlang:apply/2                    3594    0
code_server           <0.12.0>     erlang:apply/2                  415654    0
erl_prim_loader       <0.3.0>      erlang:apply/2                  900396    0
error_logger          <0.6.0>      gen_event:init_it/6               9565    0
file_server_2         <0.20.0>     file_server:init/1               18072    0
global_group          <0.19.0>     global_group:init/1               8057    0
global_name_server    <0.15.0>     global:init/1                     6341    0
inet_db               <0.18.0>     inet_db:init/1                    2394    0
init                  <0.0.0>      otp_ring0:start/2                 9920    0
kernel_safe_sup       <0.31.0>     supervisor:kernel/1               4389    0
kernel_sup            <0.11.0>     supervisor:kernel/1               9798    0
rex                   <0.14.0>     rpc:init/1                        3086    0
standard_error        <0.22.0>     erlang:apply/2                    5386    0
standard_error_sup    <0.21.0>     supervisor_bridge:standar         1402    0
user                  <0.25.0>     group:server/3                    3202    0
user_drv              <0.24.0>     user_drv:server/2                41003    0

** Registered ports on node nonode@nohost **
Name                  Id              Command                                 
ok
> (erlang:is_process_alive (c:pid 0 7 0))
true

So let's see what happens when we try to feed it something to break it, but in a meaningful way.

> (c:pid 0 0 0)
<0.0.0>
> (c:pid 111110 0 1111110)
exception error: badarg
  in (: erlang list_to_pid "<111110.0.1111110>")
  in c:pid/3 (c.erl, line 426)

So it looks like the pid <0.0.0> is a valid pid, but when we throw it something else, we see it is trying to call erlang:list_to_pid.

So let's take a quick look at erlang:list_to_pid.

> (erlang:list_to_pid "<0.47.0>")
<0.47.0>
> (=:= (c:pid 0 47 0) (erlang:list_to_pid "<0.47.0>"))
true

So c:pid/3 is really just a wrapper function around erlang:list_to_pid that builds the 3 parts of a pid into a string, and then gets a pid() type from that call.

As with the earlier c functions this function exists as an LFE repl built-in command which can be called from the repl with just (pid 0 47 0).

-Proctor, Robert



Author

Published

05 September 2015

Category

tutorials

Tags