为什么 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