监视gen_server

时间:2012-03-19 14:52:58

标签: erlang gen-server monitors

我一直在尝试使用erlang监控gen_server:monitor / 2。不幸的是,每次我尝试这个时,Erlang shell都会进入无限循环。

这是我编写的测试程序,用于测试。

-module(testmon).

-compile(export_all).

start() ->
    {ok,Proc} = gen_server:start(calc,[],[]),
    erlang:monitor(process,Proc),
    receive
        {'DOWN', Ref, process, Pid,  normal} -> 
            io:format("~p said that ~p died by natural causes~n",[Ref,Pid]);
        {'DOWN', Ref, process, Pid,  Reason} ->
            io:format("~p said that ~p died by unnatural causes~n~p",[Ref,Pid,Reason])
    end.

当我使用上面的代码监视类似spawn(fun() - > ok end)(通过更改第6行和第7行)到erlang:monitor(spawn(fun() - > ok end))上面的代码按预期工作。

有人可以告诉我我做错了什么吗?是否只能通过主管监控gen_server进程?

谢谢

1 个答案:

答案 0 :(得分:3)

这不是一个无限循环(在Erlang中根本没有循环),你的shell只是在接收中阻塞,直到gen_server由于某种原因而死亡。 如果你想让shell立即返回,只需生成一个额外的进程来进行监控。 它不一定是gen_supervisor,你的代码在单独的进程中应该按预期行事。

这看起来像这样:

-module(testmon).

-compile(export_all).

start() ->
    {ok,Proc} = gen_server:start(calc,[],[]),
    spawn(?MODULE, monitor, [Proc]).

monitor(Proc) ->
    erlang:monitor(process,Proc),
    receive
        {'DOWN', Ref, process, Pid,  normal} -> 
            io:format("~p said that ~p died by natural causes~n",[Ref,Pid]);
        {'DOWN', Ref, process, Pid,  Reason} ->
            io:format("~p said that ~p died by unnatural causes~n~p",[Ref,Pid,Reason])
    end.