当我从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.
oupput是: ** 4> trapexit:self_kill_exit()
subinmain:其中0.36.0>输出:{ '退出',< 0.36.0>,杀} **
并且不符合陷阱结果:**异常退出:之前杀死说。哪个是对的?
答案 0 :(得分:4)
作为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)
是不可能的。