pp2@nereida:~/Lerlang$ cat -n register.erl 1 % page 150, problem 1 2 % Write a function start(AnAtom. Fun) to register AnAtom 3 % as spawn(Fun). 4 -module(register). 5 -export([start_server/0, rf/1]). 6 7 start_server() -> 8 spawn(fun() -> tutu_server() end) 9 . 10 11 tutu_server() -> 12 io:format("tutu_server:~n"), 13 receive 14 { register, From, AnAtom, Fun } -> 15 Owner = whereis(AnAtom), 16 io:format("Owner: ~p~n",[Owner]), 17 if 18 Owner =/= undefined -> 19 From ! {self(), false}; 20 true -> 21 io:format("tutu_server: registering function <~p>.~n",[AnAtom]), 22 Pid = spawn(fun() -> Fun() end), 23 register(AnAtom, Pid), 24 From ! {self(), true} 25 end, 26 tutu_server(); 27 { From, Any } -> 28 io:format("tutu_server: received <~p> from ~p~n",[Any, From]), 29 From ! {self(), false}, 30 tutu_server(); 31 Any -> 32 io:format("tutu_server: received <~p>~n",[Any]), 33 tutu_server() 34 end 35 . 36 37 rf(Pid) -> 38 Pid! { register, self(), toto, fun() -> timer(10, 1) end}, 39 receive 40 {Pid, true} -> 41 io:format("accepted request~n"); 42 {Pid, false} -> 43 io:format("denied request~n"); 44 Any -> 45 io:format("error: received<~p>~n",[Any]) 46 end 47 . 48 49 timer(Time, I) -> 50 receive 51 cancel -> void 52 after Time -> 53 %io:format("TICK: ~p~n", [erlang:now()]), 54 if 55 I < 1000 -> 56 %io:format("I = ~p~n", [I]), 57 timer(Time, I+1); 58 true -> 59 io:format("end of loop reached I = ~p~n", [I]) 60 end 61 end 62 .
Ejecución:
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(register). {ok,register} 2> P = register:start_server(). tutu_server: <0.38.0> 3> register:rf(P). Owner: undefined tutu_server: registering function <toto>. tutu_server: accepted request ok 4> register:rf(P). Owner: <0.40.0> tutu_server: denied request ok end of loop reached I = 1000 5> register:rf(P). Owner: undefined tutu_server: registering function <toto>. tutu_server: accepted request ok 6> register:rf(P). Owner: <0.43.0> tutu_server: denied request ok 7> register:rf(P). Owner: <0.43.0> tutu_server: denied request ok 8> register:rf(P). Owner: <0.43.0> tutu_server: denied request ok end of loop reached I = 1000 9>
Casiano Rodríguez León