在观看了Erlang上的Pragmatic Studio屏幕后,Supervisors上的最后一个视频提到,为了让主管得到关于其中一个孩子的通知以便它可以正确地重新启动它,孩子应该注册process_flag(trap_exit, true).也许我只是误解了作者(很可能我误解了很多),但我认为主管们会自动知道他们的孩子何时死亡(可能是通过spawn_link或背景中类似的东西).这真的有必要吗?什么时候应该在实际案例中使用process_flag(trap_exit,true),因为文档明确说明了以下内容:
http://www.erlang.org/doc/man/erlang.html#process_flag-2
process_flag(trap_exit,Boolean)
当trap_exit设置为true时,到达进程的退出信号将转换为{'EXIT',From,Reason}消息,这些消息可作为普通消息接收.如果trap_exit设置为false,则如果它接收到除正常之外的退出信号并且退出信号传播到其链接进程,则进程退出.申请流程通常不会陷入退出.`
我已经实现了一个 gen_server 和 supervisor: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,...]
Run Code Online (Sandbox Code Playgroud)
我可以与服务器交互,一切看起来都很好。
但是,如果我尝试使用 做同样的事情test_sup,则在我的“CLI 过程”(使用registered/0)中不会注册新名称/Pid 。我的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,...]
Run Code Online (Sandbox Code Playgroud)
为什么我可以生成 gen_server 但不能生成主管?
更新
我正在使用的代码可以在这篇文章中找到。我正在使用echo_serverand echo_sup,两个非常简单的模块。
鉴于该代码,这有效:
spawn(echo_server, start_link, []).
Run Code Online (Sandbox Code Playgroud)
这不会:
spawn(echo_sup, start_link, []).
Run Code Online (Sandbox Code Playgroud)