パスワードを忘れた? アカウント作成
6377195 journal
プログラミング

t-nissieの日記: 【電脳】Erlangで遊んでみた 3日目 その1 プロセスのspawnと生死の監視

日記 by t-nissie

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>

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家

読み込み中...