gen_server
документация по обратному вызову Module:terminate
говорит:
Даже если процесс gen_server не является частью дерева надзора, эта функция вызывается, если она получает сообщение EXIT от своего родителя. Причина та же, что и в сообщении «ВЫХОД».
Вот мои handle_info
и terminate
функции:
handle_info(UnknownMessage, State) ->
io:format("Got unknown message: ~p~n", [UnknownMessage]),
{noreply, State}.
terminate(Reason, State) ->
io:format("Terminating with reason: ~p~n", [Reason]).
Я запускаю этот сервер с помощью gen_server:start
. Я предполагаю, что когда я вызываю erlang:exit(Pid, fuckoff)
, он должен вызывать функцию обратного вызова terminate
. Но это показывает:
Got unknown message: {'EXIT',<0.33.0>,fuckoff}
Это означает, что он звонит handle_info
. Но когда я звоню gen_server:stop
, все работает, как указано в документации. Звоню своему gen_server
из оболочки. Не могли бы вы прояснить это?
[ОБНОВЛЕНИЕ]
Здесь исходный код функции decode_msg
. внутри gen_server
. Если он получает какое-либо сообщение «EXIT», он должен вызвать terminate
функцию:
decode_msg(Msg, Parent, Name, State, Mod, Time, Debug, Hib) ->
case Msg of
{system, From, Req} ->
sys:handle_system_msg(Req, From, Parent, ?MODULE, Debug,
[Name, State, Mod, Time], Hib);
{'EXIT', Parent, Reason} ->
terminate(Reason, Name, Msg, Mod, State, Debug);
_Msg when Debug =:= [] ->
handle_msg(Msg, Parent, Name, State, Mod);
_Msg ->
Debug1 = sys:handle_debug(Debug, fun print_event/3,
Name, {in, Msg}),
handle_msg(Msg, Parent, Name, State, Mod, Debug1)
end.
В моем случае он не вызывает функцию terminate
.
[ОБНОВЛЕНИЕ]
Когда я начинаю gen_server
с gen_server:start_link()
, отправка сигнала выхода с использованием erlang:exit(Pid, Reason)
приведет к вызову terminate
функции обратного вызова, что является ожидаемым поведением. Кажется, есть разница в интерпретации сигнала выхода, связан ли процесс со своим родителем или нет.
trap_exit
флаг процесса наtrue
где-то в коде? - person Hamidreza Soleimani   schedule 25.09.2016init
функции. - person Majid Azimi   schedule 25.09.2016