我有一个simple_one_for_one
主管在监视一组主管,其子规格类似于
init([]) ->
{ok, {{simple_one_for_one, 60, 5},
[{subsup, {subsup, start_link, []},
permanent, infinity, supervisor, dynamic}]}}.
我的start_child
函数如下所示:
start_subsup(Name) ->
SupName = {via, ?MODULE, Name},
supervisor:start_child(?MODULE, [SupName]).
via
这是重要的部分:我正在注册?MODULE
- 我已正确实施register_name/2
, unregister_name/1
, whereis_name/1
, 和send/2
(由 ets 表支持)。如有必要,我也可以发布该代码。
我孩子的 start_link 函数如下所示:
start_link(SupName) ->
supervisor:start_link(SupName, ?MODULE, []).
好的,一旦一切都启动并运行,将会发生类似以下的事情:
%% This returns a live pid. cool.
Pid = sup:whereis_name(name),
%% I can terminate it, and it really dies
ok = supervisor:terminate_child(sup, Pid),
undefined = process_info(Pid),
%% But! it never calls unregister_name!?
Pid = sup:whereis_name(name).
我设置了所有这些,以便我可以让子主管死亡并重新启动,但它被未注册的名称所阻止。
提前致谢!