t-nissieの日記: 【電脳】Erlangで遊んでみた 3日目 その1 プロセスのspawnと生死の監視
roulette.erl
-module(roulette).
-export([loop/0]).
loop() ->
receive
3 ->
io:format("Bang!~n"),
exit({roulette,die,at,erlang:time()});
_ ->
io:format("Click~n"),
loop()
end.
coronor.erl
-module(coroner).
-export([loop/0]).
loop() ->
process_flag(trap_exit, true),
receive
{monitor, Process} ->
link(Process),
io:format("Start to monitor a process ~p.~n",[Process]),
loop();
{'EXIT', From, Reason} ->
io:format("The shooter ~p died with reason ~p. Start another one.~n", [From, Reason]),
loop()
end.
doctor.erl
-module(doctor).
-export([loop/0]).
loop() ->
process_flag(trap_exit, true),
receive
new ->
io:format("Creating and monitoring process.~n"),
register(revolver, spawn_link(fun roulette:loop/0)),
loop();
{'EXIT', From, Reason} ->
io:format("The shooter ~p died with reason ~p.", [From, Reason]),
io:format(" Restarting. ~n"),
self() ! new,
loop()
end.
実行:
Erlang R15B02 (erts-5.9.2) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.2 (abort with ^G)
1> c(roulette).
{ok,roulette}
2> c(coroner).
{ok,coroner}
3> Revolver1 = spawn(fun roulette:loop/0).
4> erlang:is_process_alive(Revolver1).
true
5> Revolver2 = spawn(fun roulette:loop/0).
6> Revolver1 ! 1.
Click
1
7> Revolver2 ! 4.
Click
4
8> Coroner = spawn(fun coroner:loop/0).
9> Coroner ! {monitor, Revolver1}.
Start to monitor a process .
{monitor,}
10> Coroner ! {monitor, Revolver2}. % 2つ以上監視できるみたい
Start to monitor a process .
{monitor,}
11> Revolver1 ! 5.
Click
5
12> Revolver2 ! 6.
Click
6
13> Revolver1 ! 3.
Bang!
3
The shooter died with reason {roulette,die,at,{20,56,20}}. Start another one.
14> Revolver2 ! 3.
Bang!
3
The shooter died with reason {roulette,die,at,{20,56,29}}. Start another one.
15> c(doctor).
{ok,doctor}
16> Doc = spawn(fun doctor:loop/0).
17> Doc ! new.
Creating and monitoring process.
new
18> revolver ! 1.
Click
1
19> revolver ! 3.
Bang!
3
The shooter died with reason {roulette,die,at,{21,2,26}}. Restarting.
Creating and monitoring process.
20> Doc ! new. % revolverもろとも死んじゃう.doctorは1つまで?
Creating and monitoring process.
new
21>
=ERROR REPORT==== 11-Sep-2012::21:02:33 ===
Error in process with exit value: {badarg,[{erlang,register,[revolver,],[]},{doctor,loop,0,[{file,"doctor.erl"},{line,8}]}]}
21> revolver ! 4.
** exception error: bad argument
in operator !/2
called as revolver ! 4
22>
【電脳】Erlangで遊んでみた 3日目 その1 プロセスのspawnと生死の監視 More ログイン