以下是应用程序主机的源代码的一部分,它是管理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.
我的问题是:
为什么应用程序主机的行为在收到{Parent,terminate}和{'EXIT',Parent,Reason}时会有所不同?
第368行中的代码是什么意思?应用程序主文件必须在第366行。
答案 0 :(得分:1)
应用程序主机在执行受控关闭或重新启动时会收到“终止”。当它收到任何退出信号时,它会进行不受控制的关机。
如果发生不受控制的关闭,gen_servers,supervisor等会记录到错误记录器,如果它被控制则不会发出错误报告。
第368行的代码看起来像是复制粘贴错误。该行永远不会执行。