变量在Erlang中绑定一次

时间:2014-12-30 11:22:19

标签: erlang erlang-shell

编辑:我改变了这个问题的标题,因为根据我所犯的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.

此时shell挂起。我的问题是为什么第二次行为改变了,退出消息在哪里?

1 个答案:

答案 0 :(得分:3)

您的第二个receive X -> X end.已经X绑定;它试图收到与您已经看到的完全匹配的消息。由于pid会有所不同,因此消息永远不会匹配。所以它挂起,等待一个匹配的。

您需要先f(X)