编辑:我更改了这个问题的标题,因为鉴于我犯的 n00b 错误,它没有用。其余部分没有变化,并作为一个警示故事!
我正在使用 Erlang OTP 17.4 版。考虑以下 Erlang shell 会话,我正在尝试使用trap_exit
进程标志,如"Learn You Some Erlang:Errors and Processes"中所述。
首先,我设置了trap_exit
将链接进程中的退出信号转换为常规消息的标志:
Eshell V6.2 (abort with ^G)
1> process_flag(trap_exit, true).
false
然后我生成一个链接进程并立即通过调用终止它exit/2
:
2> exit(spawn_link(fun() -> timer:sleep(50000) end), kill).
true
然后我阅读了转换后的退出消息:
3> receive X -> X end.
{'EXIT',<0.61.0>,killed}
到目前为止,一切看起来都很好,就像书中描述的那样。现在,只是为了好玩,我spawn_link
终止了另一个进程:
4> exit(spawn_link(fun() -> timer:sleep(5000) end), kill).
true
并尝试阅读转换后的退出消息:
5> receive X -> X end.
此时外壳挂起。我的问题是为什么第二次的行为会发生变化,退出消息去了哪里?