我在Erlang中编写了一个简单的应用程序,但它拒绝使用以下错误:
=SUPERVISOR REPORT==== 18-Jan-2012::15:03:27 ===
Supervisor: {<0.60.0>,my_sup}
Context: start_error
Reason: {'EXIT',{undef,[{my,start,[{8077,none}]},
{supervisor,do_start_child,2},
{supervisor,start_children,3},
{supervisor,init_children,2},
{gen_server,init_it,6},
{proc_lib,init_p_do_apply,3}]}}
Offender: [{pid,undefined},
{name,my},
{mfa,{my,start,[{8077,none}]}},
{restart_type,permanent},
{shutdown,brutal_kill},
{child_type,worker}]
=INFO REPORT==== 18-Jan-2012::15:03:27 ===
application: my
exited: {shutdown,{my_app,start,[normal,[noarg]]}}
type: temporary {error,{shutdown,{my_app,start,[normal,[noarg]]}}}
模块:
my.erl
-module(my).
-export([start/2, stop/0]).
start(Port,_arg) ->
io:format("starting my").
stop() ->
ok.
my_app.erl应用程序模块,执行application
行为。
-module(my_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_Type, _Args) ->
io:format("my server starting~n"),
my_sup:start_link().
stop(_State) ->
io:format("my server terminating~n"),
ok.
my_sup.erl主管逻辑
-module(my_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() ->
supervisor:start_link(my_sup, []).
init(_Args) ->
{ok, {
{one_for_one, 10, 60},
[{my, {my, start, [{8077,none}]
},
permanent, brutal_kill, worker, [my]}]}}.
配置文件(my.app):
{application, my,
[
{description, "Demo"},
{vsn, "1.0"},
{id, "hello"},
{modules, [my,my_sup]},
{registered, [my,my_sup]},
{applications, [kernel, stdlib]},
%%
%% mod: Specify the module name to start the application, plus args
%%
{mod, {my_app, [noarg]}},
{env, []}
]
}.
我改变了你推荐的儿童规格,但问题仍然存在。
=SUPERVISOR REPORT==== 19-Jan-2012::00:34:21 ===
Supervisor: {<0.96.0>,my_sup}
Context: start_error
Reason: <0.97.0>
Offender: [{pid,undefined},
{name,my},
{mfa,{my,start,[8077,none]}},
{restart_type,permanent},
{shutdown,brutal_kill},
{child_type,worker}]
=ERROR REPORT==== 19-Jan-2012::00:34:21 ===
Error in process <0.97.0> with exit value:
{{badmatch,{error,eaddrinuse}},[{my,'- start/2-fun-0-',1}]}
=INFO REPORT==== 19-Jan-2012::00:34:21 ===
application: my
exited: {shutdown,{my_app,start,[normal,[noarg]]}}
type: temporary
{error,{shutdown,{my_app,start,[normal,[noarg]]}}}
答案 0 :(得分:4)
my:start/2
应该有两个参数,但在子规范中你只给它一个参数({8077,none}
)。您可以将子规格更改为:
{my, {my, start, [8077,none]}, permanent, brutal_kill, worker, [my]}
除此之外,您对主管规范的缩进和断线有点过分,因此很难看出属于哪些内容。
编辑:评论新错误
这与以前的问题不同。您收到一个新错误 eaddrinuse ,这通常意味着您正在尝试使用已在使用的IP地址/端口。这意味着你在代码中进行了一些套接字编程。
答案 1 :(得分:2)
你的主管指定我的:start应该接受一个参数,但它需要两个。您可能希望将子规范更改为:
{one_for_one, 10, 60},[{my, {my, start, [8077,none]}
答案 2 :(得分:0)
您的my:start/2
提供了错误的返回值。
主管期望元组{ok,Pid}
,而您的函数只返回ok
(最后一次调用是io:format
,返回ok
,因此您的函数也会这样做)。
如果要使用主管,则必须生成新进程并将其链接到主管。例如
start(_) -> {ok,spawn_link(fun() -> io:format("~w started~n",[self()]),timer:sleep(5000),io:format("~w exiting~n",[self()]) end)}.
应该为你做好工作。