转载请注明,来自:http://blog.csdn.net/skyman_2001
gen_event:start_link()可以产生一个事件管理器进程(an event manager),可以加到监控树里接受监控,这时Supervisor 的Child Specification中的Modules必须是dynamic。
下面看一个简单的例子:
logger_sup.erl:
-module(logger_sup).
-behaviour(supervisor).
-export([start_link/0 ,init/1]).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init(_) ->
{ok, {{one_for_one, 10, 10}, [
{log_mgr, {logger, start_link, []}, permanent, 1000, worker, dynamic}
]}}.
logger.erl:
-module(logger).
-behaviour(gen_event).
-export([start_link/0]).
%% gen_event callbacks
-export([init/1, handle_event/2, handle_call/2, terminate/2]).
start_link() ->
case gen_event:start_link({local, log_mgr}) of
Result = {ok, _Pid} ->
gen_event:add_handler(log_mgr, ?MODULE, [abc]),
Result;
Other ->
Other
end.
init(Args) ->
io:format("logger handler init: ~p~n", [Args]),
{ok, Args}.
... ...
编译,运行:
1> logger_sup:start_link().
logger handler init: [abc]
{ok,<0.32.0>}
2> exit(whereis(log_mgr), kill).
logger handler init: [abc]