1 -module(test_gen_server).
2
3 -behavior(gen_server).
4
5 %% apis
6 -export([
7 start/0,
8 start_link/0
9 ]).
10
11 %% callbacks
12 -export([
13 init/1,
14 handle_call/3,
15 handle_cast/2,
16 handle_info/2,
17 terminate/2,
18 code_change/3
19 ]).
20
21 %% 字符串宏
22 -define(str_concat(Format, Args), lists:flatten(io_lib:format(Format, Args))).
23
24 %% 日志宏
25 -define(err(Format, Args), error_logger:error_report(?str_concat("Module: ~p, Line:~p~n" ++ Format, [?MODULE, ?LINE | Args]))).
26 -define(info(Format, Args), io:format(?str_concat(Format ++ " in Module: ~p at Line: ~p~n", Args ++ [?MODULE, ?LINE]), [])).
27
28 %% 进程状态结构定义
29 -record(state, {}).
30
31 %% Apis -------------------------------
32 start() ->
33 gen_server:start({local, ?MODULE}, ?MODULE, [], []).
34
35 start_link() ->
36 gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
37
38 %% Callbacks --------------------------
39 init([]) ->
40 ?info("gen_server: ~p init !", [?MODULE]),
41 erlang:process_flag(trap_exit, true),
42 {ok, #state{}}.
43
44 handle_call(_Msg, _From, State) ->
45 {reply, reply, State}.
46
47 handle_cast(_Msg, State) ->
48 {noreply, State}.
49
50 handle_info(Msg, State) ->
51 ?info("recv info msg: ~p !", [Msg]),
52 {noreply, State}.
53
54 terminate(normal, _State) ->
55 ?info("gen_server: ~p stopped, reason: normal", [?MODULE]);
56 terminate(Reason, _State) ->
57 ?err("gen_server: ~p stopped, reason: ~p", [?MODULE, Reason]).
58
59 code_change(_OldVsn, State, _Extra) ->
60 {ok, State}.
61
62 %% Privates ---------------------------
E:\Worksapce\erlang_test>erl -pa ebin/
Eshell V7.1 (abort with ^G)
1> {ok, Pid} = test_gen_server:start().
gen_server: test_gen_server init ! in Module: test_gen_server at Line: 34
{ok,<0.33.0>}
2> erlang:exit(Pid, stop).
recv info msg: {'EXIT',<0.31.0>,stop} ! in Module: test_gen_server at Line: 45
true
3> erlang:exit(Pid, shutdown).
recv info msg: {'EXIT',<0.31.0>,shutdown} ! in Module: test_gen_server at Line: 45
true
4> erlang:exit(Pid, any).
recv info msg: {'EXIT',<0.31.0>,any} ! in Module: test_gen_server at Line: 45
true
5> erlang:exit(Pid, kill).
true
1> {ok, Pid} = test_gen_server:start().
gen_server: test_gen_server init ! in Module: test_gen_server at Line: 35
{ok,<0.33.0>}
2> erlang:exit(Pid, normal).
true
3> erlang:is_process_alive(Pid).
true
4> erlang:exit(Pid, any).
true
5> erlang:is_process_alive(Pid).
false
6> {ok, Pid2} =