Erlang 使用计时器更改从正在退出的衍生进程接收的错误消息

Erlang 使用计时器更改从正在退出的衍生进程接收的错误消息,erlang,Erlang,在下面的例子中,为什么一个错误消息以“exception exit”开头,而另一个错误消息以“exception error”开头 1>生成链接(乐趣()->退出(原因)结束)。 **异常退出:原因 2> 生成链接(fun()->计时器:睡眠(1),退出(原因)结束)。 **异常错误:原因 答案如下 异常退出-当进程在link之前终止时我很确定这是由于Erlang shell实现中的竞争条件造成的。请记住,shell也是另一个Erlang进程,它读取命令、解释命令、打印结果并循环。当您使用spa

在下面的例子中,为什么一个错误消息以“exception exit”开头,而另一个错误消息以“exception error”开头

1>生成链接(乐趣()->退出(原因)结束)。
**异常退出:原因
2> 生成链接(fun()->计时器:睡眠(1),退出(原因)结束)。
**异常错误:原因
答案如下


异常退出-当进程在link之前终止时

我很确定这是由于Erlang shell实现中的竞争条件造成的。请记住,shell也是另一个Erlang进程,它读取命令、解释命令、打印结果并循环。当您使用spawn_link时,新进程将链接到shell evaluator进程,当新进程终止时,将向shell evaluator进程发送一个退出信号(该进程也会因相同原因崩溃并重新启动)。所有这些对用户来说都应该是不可见的,但在某些情况下,实现细节可能会泄露出去

在第一种情况下,新进程将生成并开始运行,但会立即调用exit。在第二种情况下,它开始运行,进入睡眠状态一毫秒,再次醒来,然后退出。这意味着shell evaluator进程有足够的时间继续,打印来自spawn_链接的Pid,当它从派生进程获得退出信号时,将请求更多的输入。评估者当前所在位置的差异导致退出原因以不同方式打印。从技术上讲,我认为这是一个错误

进一步证明:

1> spawn_link(fun ()-> timer:sleep(1), exit(reason) end), timer:sleep(1).
** exception exit: reason

在这里,通过在生成新进程后休眠一毫秒,使解释代码运行更长时间,我们可以恢复原始行为。

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。这不会提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时在自己的帖子上发表评论,一旦您有足够的评论,您就可以发表评论。问题是使用spawn_link,它以原子方式生成和链接,因此链接(spawn(…)竞态条件在这种情况下不会发生。
1> link(spawn(fun() -> exit(reason) end)).
** exception exit: reason
2> link(spawn(fun() -> timer:sleep(1000), exit(reason) end)).
true
** exception error: reason
1> spawn_link(fun ()-> timer:sleep(1), exit(reason) end), timer:sleep(1).
** exception exit: reason