0

これは、erlang アプリケーションを管理するモジュールであるapplication masterのソース コードの一部です。

348 loop_it(Parent, Child, Mod, AppState) ->
349     receive
350         {Parent, get_child} ->
351             Parent ! {self(), Child, Mod},
352             loop_it(Parent, Child, Mod, AppState);
353         {Parent, terminate} ->
354             NewAppState = prep_stop(Mod, AppState),
355             exit(Child, shutdown),
356             receive
357                 {'EXIT', Child, _} -> ok
358             end,
359             catch Mod:stop(NewAppState),
360             exit(normal);
361         {'EXIT', Parent, Reason} ->
362             NewAppState = prep_stop(Mod, AppState),
363             exit(Child, Reason),
364             receive
365                 {'EXIT', Child, Reason2} ->
366                     exit(Reason2)
367             end,
368             catch Mod:stop(NewAppState);
369         {'EXIT', Child, Reason} -> % forward *all* exit reasons (inc. normal)
370             NewAppState = prep_stop(Mod, AppState),
371             catch Mod:stop(NewAppState),
372             exit(Reason);
373         _ ->
374             loop_it(Parent, Child, Mod, AppState)
375     end.

私の質問は:

  1. {Parent, terminate} と {'EXIT', Parent, Reason} を受け取ったときのアプリケーション マスターの動作が異なるのはなぜですか?

  2. 368行目のコードは何を意味していますか? アプリケーション マスターは、366 行目より前に終了している必要があります。

4

1 に答える 1

1

アプリケーション マスターは、制御されたシャットダウンまたは再起動を行うときに「終了」を受け取ります。終了シグナルを受信すると、制御されていないシャットダウンを実行します。

制御されていないシャットダウンが発生した場合、gen_servers、スーパーバイザーなどはエラー ロガーにログを記録します。制御されている場合、エラー レポートは発行されません。

368行目のコードはコピペエラーのようです。行は決して実行されません。

于 2013-08-02T08:13:13.673 に答える