У меня есть два модуля gen_server.
Первый serv.erl
-module(serv).
-behaviour(gen_server).
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
code_change/3,
terminate/2,
start_link/0
]).
start_link() ->
gen_server:start_link(?MODULE, [], []).
init([]) ->
process_flag(trap_exit, true),
spawn_link(user, start_link,[]),
{ok, []}.
handle_call(_E, _From, State) ->
{noreply, State}.
handle_cast(_Message, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
handle_info(Message, State) ->
{noreply, State}.
code_change(_OldVersion, State, _Extra) ->
{ok, State}.
И user.erl (полностью то же самое, за исключением init/1):
init([]) ->
{ok, []}.
Я думал, что серверы будут жить вечно. И если первый сервер умирает, другой получает сообщение {'EXIT', Pid, Reason}.
Но если вы запустите модули с помощью serv:start_link() , модуль user выйдет сразу после запуска с сообщением {'EXIT',Pid,normal . Почему умирает пользователь?
user
. Erlang уже поставляется с модулем с таким именем, и вы либо не увидите свой собственный модуль, либо запретите загрузку EVM, потому что ожидаемый модульuser
ведет себя не так, как ожидалось. - person ZeissS   schedule 26.07.2013