我正在嘗試爲我所做的過程寫一個主管。我已經調查了一段時間無濟於事,希望有人能夠提供幫助。在Erlang處理退出信號在手卷監督員?
我對接口有一定的限制,因爲這是用於賦值的,所以我知道使用列表的示例以及Erlang站點上更詳細的OTP示例,但是這些不適用。我提供了一個從我的應用程序中抽象出來的例子來演示這個問題。
我想,當它退出了無正常理由來重新啓動任意工人。工作進程很簡單:
-module(my_mod).
-export([start/1, init/1]).
start(Pid)->
{ok, spawn_link(?MODULE, init, [Pid])}.
init(Pid) ->
register(Pid, self()),
io:format("Started ~p~n",[Pid]),
loop().
loop() ->
receive stop -> exit(byebye) end.
在我使用ETS標籤來跟蹤工人,並重新啓動他們的上司,上司是這樣的:
-module(my_sup).
-export([start_link/0, init/1, add_item/1, remove_item/1]).
start_link() ->
spawn(?MODULE, init, [self()]).
init(Pid) ->
process_flag(trap_exit, true),
register(?MODULE, Pid),
ets:new(?MODULE, [set, named_table, public]),
loop().
add_item(Pid) ->
ets:insert(?MODULE, {Pid}),
my_mod:start(Pid),
{ok, Pid}.
remove_item(Pid) ->
ets:delete(?MODULE, [Pid]).
loop() ->
io:format("Looping ~n"),
receive
{'EXIT', Pid, _Reason} ->
remove_item(Pid),
add_item(Pid)
end.
所以我相信我做的有些事情在這裏,my_mod被鏈接回主管,以便通知退出信號,主管有trap_exit設置,以便主管必須有機會處理信號。然而,我發現我只是得到一個**異常退出:停止拋出,我不知道這是爲什麼?
我的測試情況如下:
1> c(my_sup), c(my_mod), my_sup:start_link().
Looping
<0.42.0>
2> my_sup:add_item(a).
Started a
{ok,a}
3> a ! stop .
** exception exit: byebye
任何人都可以點我在正確的方向?
謝謝你的建議,促使我四處找工作,而不是最優雅的,但是這是由於實行接口... – Opentuned 2014-12-07 20:06:35