使用计时器更改从现有的生成进程收到的错误消息

时间:2014-02-19 23:48:32

标签: erlang

以下为什么一个错误消息以“异常退出”开始,而另一个以“异常错误”开始?

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

2 个答案:

答案 0 :(得分:2)

这是答案errors-and-processes

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 :(得分:0)

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

在第一种情况下,新进程会生成并开始运行,但会立即退出。在第二种情况下,它开始运行,进入睡眠状态一毫秒,再次唤醒,然后退出。这意味着shell评估程序进程有足够的时间继续,打印由spawn_link生成的Pid,并且当它从生成的进程获得退出信号时将要求更多的输入。评估者当前所处位置的差异导致退出原因以不同方式打印(以某种方式)。从技术上讲,我会说这是一个错误。

进一步证明:

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

在这里,通过在产生新进程后睡眠一毫秒来保持解释代码运行一段时间,我们得到原始行为。