erlang:sup监控进程实例
%% @author Administrator %% @doc @todo Add description to users_sup. -module(users_sup). -behavior(supervisor). -compile(export_all). %% ==================================================================== %% API functions %% ==================================================================== -export([]). start() -> register(users_sup, spawn(?MODULE, start_monitor, [])). %% 创建监控子进程,注册为monitor,并运行 init/1 start_monitor() -> io:format("sup started: ~p~n", [self()]), {ok, Pid} = supervisor:start_link({local, monitor}, ?MODULE, []), wait(). %% monitor进程运行init/1,启动所有被监控的子进程,并监控这些进程 %% 运行 users:start %% 监控规范:被监控进程退出后,重启之,重启次数100,重启间隔10ms init(FileName) -> io:format("enter init, ~s, ~p~n", [FileName, self()]), ChildSpec = {users_s, {users_s, start, []}, permanent, 100000, worker, [users_s]}, {ok, {{one_for_one, 100, 10}, [ChildSpec]}}. %% sup进程等待退出消息 %%users_sup进程退出,从而导致monitor及所有monitor的子进程都退出 wait() -> receive {quit} -> io:format("recv quit msg~n"); {'EXIT', Pid, Reason} -> io:format("Child ~p exit~n", [Pid]), wait() end. stop() -> users_sup ! {quit}. %% ==================================================================== %% Internal functions %% ====================================================================
%% @author Administrator %% @doc @todo Add description to db_s. -module(users_s). %%-export([start/0,stop/0,write/2,delete/1,read/1,match/1,all/0]). %% ==================================================================== %% API functions %% ==================================================================== -compile(export_all). -behaviour(gen_server). -include("user.hrl"). %% ==================================================================== %% External functions %% ==================================================================== start() -> start_link(). stop() -> gen_server:cast(?MODULE, stop). add(UserID, Username, UserPd) -> gen_server:call(?MODULE, {add,UserID, Username, UserPd}). lookById(UserID) -> gen_server:call(?MODULE, {lookById,UserID}). match(Pattern) -> gen_server:call(?MODULE, {match,Pattern}). delete_tab() -> gen_server:call(?MODULE, delete_tab). all() -> gen_server:call(?MODULE, all). test() -> gen_server:call(?MODULE, test). %% ==================================================================== %% Server functions %% ==================================================================== start_link() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). init([]) -> users:init(), {ok,[]}. handle_cast(stop,LoopData) -> users:delete(), {stop,normal,LoopData}. handle_call({add,UserID, Username, UserPd},_From,LoopData) -> Reply = users:add_user(UserID, Username, UserPd), {reply,Reply,LoopData}; handle_call({lookById,UserID},_From,LoopData) -> Reply=users:look_user_byID(UserID), {reply,Reply,LoopData}; handle_call({match,Pattern},_From,LoopData) -> Reply=users:look_user_byMatch(Pattern), {reply,Reply,LoopData}; handle_call(delete_tab,_From,LoopData) -> Reply = users:delete_tab(), {reply,Reply,LoopData}; handle_call(test,_From,LoopData) -> Reply = users:test(), {reply,Reply,LoopData}; handle_call(all,_From,LoopData) -> Reply = users:check_all(), {reply,Reply,LoopData}. terminate(_Reason, _State) -> ok.
%% @author Administrator %% @doc @todo Add description to usr. -module(users). -compile(export_all). -include("user.hrl"). -define(TIMEOUT,30000). %% ==================================================================== %% API functions %% ==================================================================== init() -> ets:new(userTab,[{keypos,#user.id},named_table,public]). add_user(UserID,Username,UserPd) -> ets:insert(userTab,#user{id = UserID,name = Username,pd = UserPd}). look_user_byID(UserID) -> ets:lookup(userTab, UserID). check_all() -> check_first(). check_first() -> case ets:first(userTab)of '$end_of_table' -> ok; First -> io:format("~w~n",ets:lookup(userTab, First)), check_next(First) end. check_next(First) -> case ets:next(userTab, First) of '$end_of_table' -> ok; Next -> io:format("~w~n",ets:lookup(userTab, Next)), check_next(Next) end. delete_tab() -> ets:delete(userTab). %% ==================================================================== %% name:match_by_object %% input:#user{name="yangxin",_='_'} %% ==================================================================== look_user_byMatch(Pattern) -> ets:match_object(userTab, Pattern). test() -> init(), add_user(1,yangxin,123456), add_user(2,yangxin,12345678), %%look_user_byMatch(#user{name = "yangxin",_='_'}), check_all(). %% ==================================================================== %% Internal functions %% ====================================================================