Я реализовал 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
, новые имена / Pids не будут зарегистрированы в моем «процессе 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, []).