启动一个督程

在上面的例子中,督程是通过调用 ch_sup:start_link() 来启动的:

  1. start_link() ->
  2. supervisor:start_link(ch_sup, []).

ch_sup:start_link 调用了函数 supervisor:start_link/2 。这个函数产生了一个督程并联接到其上。

  • 第一个参数 ch_sup 是回调模块的名字,也就是回调函数 init 所放的那个模块。
  • 第二个参数,[], 这个值将被原封不动传递给回调函数 init。在这里,init无须任何输入数据将忽略这个参数。在这个例子中,该督程没有被注册。则必须使用它的pid。可以通过调用 supervisor:start_link({local,Name},Module,Args) 或者 supervisor:start_link({global,Name},Module,Args)

新的督程调用回调函数 ch_sup:init([])init 要返回 {ok,StartSpec}

  1. init(_Args) ->
  2. {ok, {{one_for_one, 1, 60},
  3. [{ch3, {ch3, start_link, []},
  4. permanent, brutal_kill, worker, [ch3]}]}}.

该督程然后根据启动规格中的子进程规格启动所有的子进程。这里只有一个子进程—— ch3

注意 supervisor:start_link 是同步的。只有所有的子进程都启动了,它才会返回。