我一直在尝试使用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进程?
谢谢
答案 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.