0

Erlang R16B03-1 (erts-5.10.4)OS X 10.9.2 で実行しています。Erlang は brew を使用してインストールされました。

そして、gen_server モジュールを実行しようとしています。

-module(logger).
-author("evangelosp").

-behaviour(gen_server).

%% API
-export([start/0, stop/0, log/2]).

%% gen_server callbacks
-export([init/1,
  handle_call/3,
  handle_cast/2,
  handle_info/2,
  terminate/2,
  code_change/3]).

-define(SERVER, ?MODULE).

%%%===================================================================
%%% API
%%%===================================================================

start() -> gen_server:start_link({global, ?SERVER}, ?MODULE, [], []).

stop() -> gen_server:call(?MODULE, stop).

log(_Level, _MSG) -> gen_server:call(?MODULE, {add, {_Level, _MSG}}).

%%%===================================================================
%%% gen_server callbacks
%%%===================================================================

init([]) -> {ok, ets:new(?MODULE, [])}.

handle_call(_Request, _From, Table) -> {reply, {ok, ["Mplah!", _Request, _From, Table]}, Table}.

handle_cast(_Request, State) -> {noreply, State}.

handle_info(_Info, State) -> {noreply, State}.

terminate(_Reason, _State) -> ok.

code_change(_OldVsn, State, _Extra) -> {ok, State}.

私が実行しているerlangシェルで:

Eshell V5.10.4  (abort with ^G)
1> c(logger).
{ok,logger}
2> logger:start().
{ok,<0.40.0>}
3> logger:log(info, "Hello World").
** exception exit: {noproc,{gen_server,call,
                                       [logger,{add,{info,"Hello World"}}]}}
     in function  gen_server:call/2 (gen_server.erl, line 180)

そして、私はその例外を取り除くことができません。例外メッセージを調べても有用なリソースは実際には見つかりませんでしたが、これはあまり役に立ちませんでした。

乾杯。

4

2 に答える 2

1

サーバーは登録されていないため、pid によってのみアクセスできます。しかし、インターフェイス関数は暗黙のマクロ ?MODULE (コンパイル時に logger に置き換えられる) を使用してアクセスします。

インターフェイス関数を変更するか、サーバーを開始関数に登録する必要があります。

start() ->
  {ok,Pid} = gen_server:start_link({global, ?SERVER}, ?MODULE, [], []),
  register(?MODULE,Pid).

[編集] Evalon に感謝します。答えを修正しました :o)

于 2014-06-08T11:06:25.950 に答える