当我直接运行gen_server时,我有一个简单的gen_server连接到tcp端口:
erl -noshell -s ttest start
它工作正常,但是当我运行时:
erl -noshell -s tt_sup start_link
连接将立即关闭,如果我取消链接主管,它将可以使用:
erl -noshell -s tt_sup start_shell
我如何与主管一起运行简单的gen_tcp:connect(gen_server)?
主管:
-module(tt_sup).
-behaviour(supervisor).
-export([init/1, start_link/0, start_shell/0]).
start_link() ->
io:format("Supervisor started with PID~p~n", [self()]),
{ok, Pid} = supervisor:start_link(tt_sup, []),
io:format("Supervisor PID=~p~n", [Pid]),
{ok, Pid}.
start_shell() ->
io:format("Supervisor started with PID~p~n", [self()]),
{ok, Pid} = supervisor:start_link(tt_sup, []),
io:format("Supervisor PID=~p~n", [Pid]),
unlink(Pid),
{ok, Pid}.
init(_Args) ->
SupFlags = #{strategy => one_for_one},
Child = [#{id => ttest, start => {ttest, start, []},
restart => permanent, shutdown => brutal_kill,
type => worker, modules => [ttest]}],
{ok, {SupFlags, Child}}.
gen_server:
-module(ttest).
-export([start/0,init/1,handle_cast/2,handle_call/3,handle_info/2,terminate/2,connect/1]).
-behaviour(gen_server).
start() ->
io:format("gen_server start id is ~p~n",[self()]),
{ok,Pid} = gen_server:start_link({local,ttest},ttest,[],[]),
io:format("gen_server id is ~p~n",[Pid]),
connect(Pid),
{ok,Pid}.
init(_Args) ->
io:format("init id is ~p~n",[self()]),
{ok,[]}.
handle_call({tcp,Socket,Bin},_From,States) ->
{reply,States,States}.
handle_info({tcp,Socket,Bin},States) ->
io:format("got info msg"),
{noreply,States}.
handle_cast({send,Msg},States) ->
{reply,States}.
connect(I) ->
io:format("connect id is ~p~n",[self()]),
{ok,Socket} =gen_tcp:connect("localhost",6000,[binary,{active,true}]),
gen_tcp:controlling_process(Socket,I).
terminate(shutdown, State) ->
io:format("terminating"),
ok.
没有更多代码执行时运行-s
退出的过程normal
。主管接收信号和因为它从它的父是,它退出(无论它是的normal
),如在解释gen_server:终止/ 2(supervisor
s为gen_server
s的trap_exit
活性):
即使gen_server进程不是监督树的一部分,但如果它从其父级接收到“ EXIT”消息,也会调用此函数。原因与“退出”消息中的相同。
我没有测试你的代码,但如果添加process_flag(trap_exit, true)
到你的gen_server
,你一定会复制这种行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句