我已经实现了gen_server和主管:test_server
和test_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过程”中不会注册新名称/ Pids(使用registered/0
)。我的test_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但不能产生主管?
更新
我正在使用的代码可以在this post中找到。我正在使用echo_server
和echo_sup
两个非常简单的模块。
鉴于该代码,这有效:
spawn(echo_server, start_link, []).
而这不是:
spawn(echo_sup, start_link, []).
答案 0 :(得分:3)
每当试图解决这些问题时,打开SASL通常都非常有帮助。
应用:启动(SASL)
这样你就可以了解主管为什么要终止。
答案 1 :(得分:1)
Bernard Duggan在Erlang questions mailing list:
上给出了这个解释链接的进程不会自动进行 当他们被链接的过程死亡 退出代码“正常”。这就是为什么 [echo_server]不会退出时 产卵过程退出。那么为什么呢 主管死了吗?内部的 事实上,主管模块 自己实现为 gen_server,但有 process_flag(trap_exit,true)设置。 这样做的结果就是当 父进程死掉,terminate()得到 叫(当发生时不会发生) trap_exit已禁用)和 主管关闭。这说得通 在主管的背景下,从那以后 主管由其父母产生 在监督树 - 如果没有 父母关闭时死亡, 无论什么原因,你都有 悬挂在树上的“树枝”。