Невозможно создать супервизор erlang из оболочки

Я реализовал gen_server и supervisor: test_server и test_sup. Я хочу протестировать их из оболочки / 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) новые имена / идентификаторы не будут зарегистрированы. Мой test_server, похоже, был создан, но я не могу с ним взаимодействовать (см. Комментарий Лукаса Ларссона о 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_server и echo_sup, два очень простых модуля.

Учитывая этот код, это работает:

spawn(echo_server, start_link, []).

а это не так:

spawn(echo_sup, start_link, []).

person drfloob    schedule 07.05.2010    source источник
comment
Вы можете куда-нибудь вставить свой код?   -  person YasirA    schedule 07.05.2010


Ответы (2)


Когда бы вы ни пытались разобраться в этих вещах, обычно очень полезно включить SASL.

приложение: start (sasl).

Таким образом, вы, надеюсь, узнаете, почему ваш руководитель увольняется.

person Lukas    schedule 07.05.2010
comment
Похоже, что это не прекращается. После запуска SASL я получаю отчет о ходе выполнения, в котором говорится, что echo_sup и echo_server были запущены, но после этого echo_server недоступен из командной строки. - person drfloob; 07.05.2010
comment
Мне нужно было бы увидеть ваш код супервизора и ваш gen_server, чтобы помочь вам больше. Вероятно, вам не хватает чего-то маленького. - person Lukas; 08.05.2010
comment
Я связался с кодом в обновлении №1. Вот снова ссылка - person drfloob; 08.05.2010

Это объяснение было дано Бернардом Дагганом в списке рассылки вопросов Erlang:

Связанные процессы не умирают автоматически, когда процесс, с которым они связаны, завершается с «нормальным» кодом. Вот почему [echo_server] не завершает работу, когда завершается процесс создания. Так почему же умирает руководитель? Внутреннее устройство модуля супервизора фактически само реализовано как gen_server, но с установленным флагом process_flag (trap_exit, true). В результате, когда родительский процесс умирает, вызывается terminate () (чего не происходит, когда trap_exit отключен), и супервизор завершает работу. Это имеет смысл в контексте супервизора, поскольку супервизор порождается своим родителем в дереве супервизора - если бы он не умирал при выключении родителя, по какой бы то ни было причине, у вас были бы болтающиеся «ветви» дерева.

person drfloob    schedule 10.05.2010