3

当我从 learnyousomeerlang.com 阅读一篇文章时,我有一个问题。 http://learnyousomeerlang.com/errors-and-processes

它说:

异常来源: exit(self(), kill)

未捕获的结果: ** exception exit: killed

被困结果: ** exception exit: killed

哎呀,看那个。看来这一个实际上是不可能被困住的。让我们检查一下。

但它不符合我用代码测试的内容:

  -module(trapexit).
  -compile(export_all).
  self_kill_exit()->
  process_flag(trap_exit,true),
  Pid=spawn_link(fun()->timer:sleep(3000),exit(self(),kill)  end),
  receive
    {_A,Pid,_B}->io:format("subinmain:~p output:~p~n",[Pid,{_A,Pid,_B}])
  end.

输出为:**4> trapexit:self_kill_exit()。

subinmain:<0.36.0> 输出:{'EXIT',<0.36.0>,killed}**

并且不符合 Trapped Result: ** exception exit: kill 之前所说的。哪个是对的???

4

1 回答 1

5

self作为参数传递给的函数体中的调用spawn_link不会返回进程调用spawn_link。它正在新生成的进程中进行评估,因此它将返回其 pid。进行以下更改。

-module(trapexit).
-compile(export_all).
self_kill_exit()->
  process_flag(trap_exit,true),
  Self=self(),
  Pid=spawn_link(fun()->timer:sleep(3000),exit(Self,kill)  end),
  receive
    {_A,Pid,_B}->io:format("subinmain:~p output:~p~n",[Pid,{_A,Pid,_B}])
  end.

现在它应该按预期工作。

10> c(trapexit).            
{ok,trapexit}
11> trapexit:self_kill_exit().
** exception exit: killed

书是对的。诱捕exit(self(), kill)是不可能的。

于 2012-10-30T07:31:07.707 回答