user_sup.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 120 行

ERL
120
字号
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(user_sup).%% ---------------------------------------------%% This is a supervisor bridge hiding the process%% details of the user/group implementation.%% ----------------------------------------------behaviour(supervisor_bridge).-export([start/0]).%% Internal exports.-export([init/1, terminate/2, relay/1]).start() ->    supervisor_bridge:start_link(user_sup, []).init([]) ->    case get_user() of	nouser ->	    ignore;	{master, Master} ->	    Pid = start_slave(Master),	    {ok, Pid, Pid};	{M, F, A} ->	    case start_user({M, F}, A) of		{ok, Pid} ->		    {ok, Pid, Pid};		Error ->		    Error	    end    end.start_slave(Master) ->    case rpc:call(Master, erlang, whereis, [user]) of	User when is_pid(User) ->	    spawn(?MODULE, relay, [User]);	_ ->	    error_logger:error_msg('Cannot get remote user', []),	    receive after 1000 -> true end,	    halt()    end.relay(Pid) ->    register(user, self()),    relay1(Pid).relay1(Pid) ->    receive        X ->            Pid ! X,	    relay1(Pid)    end.%%-----------------------------------------------------------------%% Sleep awhile in order to let user write all (some) buffered %% information before termination.%%-----------------------------------------------------------------terminate(_Reason, UserPid) ->    receive after 1000 -> ok end,    exit(UserPid, kill),    ok.%%-----------------------------------------------------------------%% If there is a user, wait for it to register itself.  (But wait%% no more than 10 seconds).  This is so the application_controller%% is guaranteed that the user is started.%%-----------------------------------------------------------------start_user(Func,A) ->    apply(Func, A),    wait_for_user_p(100).wait_for_user_p(0) ->    {error, nouser};wait_for_user_p(N) ->    case whereis(user) of	Pid when is_pid(Pid) ->	    link(Pid),	    {ok, Pid};	_ ->	    receive after 100 -> ok end,	    wait_for_user_p(N-1)    end.get_user() ->    Flags = init:get_arguments(),    check_flags(Flags, {user_drv, start, []}).%% These flags depend upon what arguments the erl script passes on%% to erl91.check_flags([{nouser, []} |T], _) -> check_flags(T, nouser);check_flags([{user, [User]} | T], _) ->    check_flags(T, {list_to_atom(User), start, []});check_flags([{noshell, []} | T], _) -> check_flags(T, {user, start, []});check_flags([{oldshell, []} | T], _) -> check_flags(T, {user, start, []});check_flags([{noinput, []} | T], _) -> check_flags(T, {user, start_out, []});check_flags([{master, [Node]} | T], _) ->    check_flags(T, {master, list_to_atom(Node)});check_flags([_H | T], User) -> check_flags(T, User);check_flags([], User) -> User.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?