为什么 spawn link 不会导致调用进程终止?
Why doesn't spawn link cause the calling process to die?
根据此处给出的示例,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, []).
生成的进程 <0.40.0> 按预期死亡,但生成它的主进程 (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 没有捕获退出)那么它为什么不退出?
原因是您将 trap_exit
标志设置为 true
,这意味着此进程将收到 {'EXIT', FromPid, Reason}
消息而不是被杀死。只需删除 process_flag(trap_exit, true)
或在收到此类消息的情况下将其杀死。
你可以阅读它 here。
根据此处给出的示例,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, []).
生成的进程 <0.40.0> 按预期死亡,但生成它的主进程 (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 没有捕获退出)那么它为什么不退出?
原因是您将 trap_exit
标志设置为 true
,这意味着此进程将收到 {'EXIT', FromPid, Reason}
消息而不是被杀死。只需删除 process_flag(trap_exit, true)
或在收到此类消息的情况下将其杀死。
你可以阅读它 here。