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 .
