1

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しています -- 、、、および(ets テーブルに裏打ちされた)?MODULEを適切に実装しました。必要に応じて、そのコードも投稿できます。register_name/2unregister_name/1whereis_name/1send/2

私の子供の 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).

子スーパーバイザーを停止させて再起動できるようにすべてを設定しましたが、名前が登録解除されていないためにブロックされています。

前もって感謝します!

4

2 に答える 2

0

停止した子が終了を実行するには、終了シグナルをトラップする必要があります。子プロセスでこれを呼び出しますinit:

process_flag(trap_exit, true)
于 2013-07-11T00:30:57.417 に答える