Besides addressing a process by using its pid, there are also BIFs for registering a process under a name. The name must be an atom and is automatically unregistered if the process terminates:
register(Name, Pid) Associates the name Name, an atom, with the process Pid. registered() Returns a list of names which have been registered using register/2. whereis(Name) Returns the pid registered under Name, or undefined if the name is not registered.
pp2@nereida:~/Lerlang$ cat -n area_server0.erl 1 -module(area_server0). 2 -export([loop/0]). 3 %% ~~~~~~ 4 5 loop() -> 6 receive 7 {rectangle, Width, Ht} -> 8 io:format("Area of rectangle is ~p~n", [Width*Ht]), 9 loop(); 10 {circle, R} -> 11 io:format("Area of circle is ~p~n", [3.14159*R*R]), 12 loop(); 13 Other -> 14 io:format("I don't know what the area of a ~p is ~n", [Other]), 15 loop() 16 end.
3> c(area_server0). {ok,area_server0} 4> Pid = spawn(fun area_server0:loop/0 end). * 2: syntax error before: 'end' 4> Pid = spawn(fun area_server0:loop/0). <0.45.0> 5> register(area, Pid). true 6> area! { rectangle, 4, 5} 6> . Area of rectangle is 20 {rectangle,4,5}
pp2@nereida:~/Lerlang$ erl Erlang (BEAM) emulator version 5.6.5 [source] [64-bit] [smp:8] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.6.5 (abort with ^G) 1> c(clock). {ok,clock} 2> clock:start(5000, fun() -> io:format("TICK ~p~n", [erlang:now()) end). * 1: syntax error before: ')' 2> clock:start(5000, fun() -> io:format("TICK ~p~n", [erlang:now()]) end). true TICK {1259,174993,316298} TICK {1259,174998,320447} TICK {1259,175003,325772} TICK {1259,175008,330987} TICK {1259,175013,332715} 3> clock:stop(). stop 4>
pp2@nereida:~/Lerlang$ cat -n clock.erl 1 -module(clock). 2 -export([start/2, stop/0]). 3 4 start(Time, Fun) -> 5 register(clock, spawn(fun() -> tick(Time, Fun) end)) 6 . 7 8 stop() -> clock! stop. 9 10 tick(Time, Fun) -> 11 receive 12 stop -> void 13 after Time -> Fun(), tick(Time, Fun) 14 end 15 .