5

我已经实现了 gen_server 和 supervisor:test_servertest_sup. 我想从 shell/CLI 测试它们。我已经编写了它们的start_link函数,以便它们的名称在本地注册。

我发现我可以test_server从命令行生成就好了,但是生成的test_sup根本不允许我与服务器交互。

例如,我可以test_server通过执行产生一个:

1> spawn(test_server, start_link, []).
<0.39.0>
2> registered().
[...,test_server,...]

我可以与服务器交互,一切看起来都很好。

但是,如果我尝试用 做同样的事情test_sup,我的“CLI 进程”(使用registered/0)中不会注册新的名称/Pid。Mytest_server似乎已生成,但我无法与之交互(请参阅 Lukas Larsson 对 SASL 的评论以了解为什么这是真的)。

我假设我在主管中编写了一个错误,但是这种启动主管的方法非常有效:

1> {ok, Pid}= test_sup:start_link([]).
{ok, <0.39.0>}
2> unlink(Pid).
true
3> registered().
[...,test_server,test_sup,...]

为什么我可以生成 gen_server 但不能生成主管?


更新

我正在使用的代码可以在这篇文章中找到。我正在使用echo_serverand echo_sup,两个非常简单的模块。

鉴于该代码,这有效:

spawn(echo_server, start_link, []).

这不会:

spawn(echo_sup, start_link, []).
4

2 回答 2

4

每当试图弄清楚这些事情时,打开 SASL 通常会很有帮助。

应用程序:开始(sasl)。

通过这种方式,您有望了解您的主管为何终止工作。

于 2010-05-07T06:23:37.317 回答
2

Bernard Duggan 在Erlang 问题邮件列表中给出了这个解释:

当链接到的进程以“正常”代码退出时,链接的进程不会自动死亡。这就是为什么 [echo_server] 在生成过程退出时不退出的原因。那么主管为什么会死呢?主管模块的内部实际上是作为 gen_server 实现的,但设置了 process_flag(trap_exit, true)。这样做的结果是,当父进程死亡时,terminate() 被调用(当 trap_exit 被禁用时不会发生这种情况)并且主管关闭。这在主管的上下文中是有道理的,因为主管是由其父级在监督树中产生的——如果它在父级关闭时没有死,不管是什么原因,你都会有树的“分支”悬空。

于 2010-05-10T04:09:26.063 回答