Erlang的进程监控实验

分享实验Erlang by 达达 at 2011-01-31

晚上快速的实验了一下Erlang的monitor函数,实验中分两种情况,一种是被监控的进程自然消亡,另一种是被监控的进程异常退出。实验结论是两种情况下,负责监控的进程都可以收到DOWN信号。

下面是实验代码:

-module(monitor_test).
-export([run/0]).
-export([master_main/0, child_main/0]).

run() ->
    {ok, Master, Child1, Child2} = proc_lib:start_link(?MODULE, master_main, []),
    Master ! go,
    Child1 ! normal,
    Child2 ! exception,
    ok.
    
master_main() ->
    Child1 = spawn(?MODULE, child_main, []),
    Child2 = spawn(?MODULE, child_main, []),
    monitor(process, Child1),
    monitor(process, Child2),
    proc_lib:init_ack({ok, self(), Child1, Child2}),
    wait(0).
    
wait(0) ->
    receive
        go -> wait(1)
    end;
wait(3) ->
    ok;
wait(C) ->
    receive
        {'DOWN', _, process, Pid, Info} -> 
            io:format("~p DOWN: ~p~n", [Pid, Info]),
            wait(C + 1)
    end.

    
child_main() ->
    receive
        normal -> ok;
        exception -> true = filelib:is_file("no_this_file")
    end.