application_master.erl源代码中退出/ 1后的多余代码

时间:2013-08-02 07:34:27

标签: erlang otp

以下是应用程序主机的源代码的一部分,它是管理erlang应用程序的模块。

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行

  3. 之前退出

1 个答案:

答案 0 :(得分:1)

应用程序主机在执行受控关闭或重新启动时会收到“终止”。当它收到任何退出信号时,它会进行不受控制的关机。

如果发生不受控制的关闭,

gen_servers,supervisor等会记录到错误记录器,如果它被控制则不会发出错误报告。

第368行的代码看起来像是复制粘贴错误。该行永远不会执行。