为什么不生成链接导致调用进程死亡?

时间:2015-06-05 19:23:01

标签: erlang erlang-shell

从此处给出的示例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没有捕获退出)然后为什么不退出?

1 个答案:

答案 0 :(得分:4)

原因是你将trap_exit标志设置为true,这意味着此过程将获得{'EXIT', FromPid, Reason}消息而不是被杀死。只需删除process_flag(trap_exit, true),或者如果收到此类消息,请将其删除。

您可以阅读here