【问题标题】:Why doesn't spawn link cause the calling process to die?为什么生成链接不会导致调用进程死亡?
【发布时间】:2015-06-06 13:03:35
【问题描述】:

根据此处给出的示例,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, []).

生成的进程 会死掉,但生成它的主进程 (A ) 不会死。

{'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 没有捕获退出)那么它为什么不退出?

【问题讨论】:

  • 您使用的是什么版本的 Erlang/OTP?在 17.4 上,spawn_link(erlang, div, [1, 0]) 会杀死产生它的 shell 进程。有可能在更高(或更早)的版本中,他们向 shell 进程添加了退出陷阱。
  • erl -v Erlang/OTP 17 [erts-6.2] [source-aaaefb3] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel- poll:false] Eshell V6.2(使用 ^G 中止)
  • Shell 被 div 杀死了 0 对我来说也是如此 2> self()。 3> spawn_link(fun() -> 1/0 end)。 =错误报告==== 5-Jun-2015::16:21:47 === 进程 出错,退出值:{badarith,[{erlang,'/',[1,0] ,[]}]} ** 异常退出:运算符 '/'/2 中的 badarith 称为 1 / 0 4> self()。 5>

标签: erlang erlang-shell


【解决方案1】:

原因是您将trap_exit 标志设置为true,这意味着该进程将收到{'EXIT', FromPid, Reason} 消息而不是被杀死。只需删除process_flag(trap_exit, true) 或在收到此类消息的情况下将其杀死。

你可以阅读它here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多