<div dir="ltr">Hi all,<div><br></div><div style>I'm still new to Erlang and am having difficulty understanding why the system (or shell) hangs when a process at the end of a chain of linked processes crashes.</div><div style>
<br></div><div style>Here is the parent module (exits are being trapped).</div><div style><br></div><div style><div>-module (parent).</div><div>-export ([start/0, init/0]).</div><div><br></div><div>start() -></div><div>
<span class="" style="white-space:pre">       </span>spawn_link(parent, init, []).</div><div><br></div><div>init() -></div><div><span class="" style="white-space:pre">  </span>process_flag(trap_exit, true),</div><div><span class="" style="white-space:pre">     </span>apply(child, start, []),</div>
<div><span class="" style="white-space:pre">    </span>loop().</div><div><br></div><div>loop() -></div><div><span class="" style="white-space:pre">        </span>receive</div><div><span class="" style="white-space:pre">            </span>{'EXIT', Pid, _Reason} -></div>
<div><span class="" style="white-space:pre">                    </span>io:format("Trapped exit pid ~p~n", [Pid]);</div><div><span class="" style="white-space:pre">                       </span>%%loop();</div><div><span class="" style="white-space:pre">          </span>Other -></div>
<div><span class="" style="white-space:pre">                    </span>io:format("Other ~p~n", [Other])</div><div><span class="" style="white-space:pre"> </span>end.</div><div><br></div><div style>And here is the child. The child is started by the parent.</div>
<div style><br></div><div style><div>-module (child).</div><div>-export ([start/0, calc/1, loop/0]).</div><div><br></div><div>start() -></div><div><span class="" style="white-space:pre">     </span>register(child, spawn_link(child, loop, [])).</div>
<div><br></div><div>calc(Msg) -></div><div><span class="" style="white-space:pre">     </span>child ! {Msg, self()},</div><div><span class="" style="white-space:pre">     </span>receive Result -> Result end.</div><div><br></div>
<div>loop() -></div><div><span class="" style="white-space:pre"> </span>receive</div><div><span class="" style="white-space:pre">            </span>{Msg, From} -></div><div><span class="" style="white-space:pre">                  </span>From ! Msg + 2,</div>
<div><span class="" style="white-space:pre">                    </span>loop()</div><div><span class="" style="white-space:pre">     </span>end.</div><div style><br></div><div style>When the child crashes, the system hangs. I have to interrupt the process to restore the shell.</div>
<div style><br></div><div style><div>263> parent:start().</div><div><0.620.0></div><div>264> child:calc(a).</div><div>Trapped exit pid <0.621.0></div><div><br></div><div>=ERROR REPORT==== 21-Jul-2013::15:11:03 ===</div>
<div>Error in process <0.621.0> with exit value: {badarith,[{child,loop,0,[{file,"child.erl"},{line,14}]}]}</div><div><br></div><div><br></div><div>User switch command</div><div> --> i</div><div> --> c</div>
<div>** exception exit: killed</div><div>265> i().</div><div><br></div><div style>On the other hand, if the parent code is altered to not trap exits, the crash takes down the child, parent, and shell, but the system does not hang. I immediately end up with a new shell process.</div>
<div style><br></div><div style><div>260> child:calc(a).</div><div><br></div><div>=ERROR REPORT==== 21-Jul-2013::15:09:52 ===</div><div>Error in process <0.607.0> with exit value: {badarith,[{child,loop,0,[{file,"child.erl"},{line,14}]}]}</div>
<div><br></div><div>** exception exit: badarith</div><div>     in function  child:loop/0 (child.erl, line 14)</div><div>261> </div><div><br></div><div style>Sorry for the rookie question, but I just can not figure it out. Can someone explain this behaviour or point me to some documentation. Thanks.</div>
</div></div></div></div></div>