从此处给出的示例Erlang and process_flag(trap_exit, true)
-module(play).
-compile(export_all).
start() ->
process_flag(trap_exit, true),
spawn_link(?MODULE, inverse, [***0***]),
loop().
loop() ->
receive
Msg -> io:format("~p~n", [Msg])
end,
loop().
inverse(N) -> 1/N.
如果我按原样运行,
A = spawn(play, start, []).
产生的过程&lt; 0.40.0&gt;按照它的假设而死,但产生它的主要过程(A <0.39.0>)并没有死亡。
{'EXIT',<0.40.0>,{badarith,[{play,inverse,1,[{file,"play.erl"},{line,15}]}]}}
<0.39.0>
i().
....
....
<0.39.0> play:start/0 233 19 0
play:loop/0 1
A确实得到退出信号(不是退出消息,因为A没有捕获退出)然后为什么不退出?
答案 0 :(得分:4)
原因是你将trap_exit
标志设置为true
,这意味着此过程将获得{'EXIT', FromPid, Reason}
消息而不是被杀死。只需删除process_flag(trap_exit, true)
,或者如果收到此类消息,请将其删除。
您可以阅读here。