【问题标题】:Variables bind once in Erlang变量在 Erlang 中绑定一次
【发布时间】:2015-02-26 13:31:15
【问题描述】:

编辑:我更改了这个问题的标题,因为考虑到我犯的 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 挂起。我的问题是为什么第二次的行为会发生变化,退出消息去了哪里?

【问题讨论】:

  • 在shell中,可以使用flush()打印收到的消息。

标签: erlang erlang-shell


【解决方案1】:

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

你需要先f(X)

【讨论】:

  • 谢谢和“Doh!”。我的 n00b 身份在那里闪闪发光。 :)
猜你喜欢
  • 2016-06-14
  • 2018-02-25
  • 2023-04-03
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2012-11-25
相关资源
最近更新 更多