gpt4 book ai didi

Erlang Application start/2 不会执行

转载 作者:行者123 更新时间:2023-12-05 09:23:39 24 4
gpt4 key购买 nike

这是我能想到的最基本的应用程序,我无法理解为什么应用程序模块函数的 start/2 不会记录消息。这是我所做的:

1)应用配置文件(test_app.app):

{application,test_app,
[{description,"Test App"},
{vsn,0.9},
{applications,[kernel,stdlib]},
{modules,[test_app,log_utils]},
{registered,[test_app]}]}.

2)应用模块(test_app.erl):

-module(test_app).
-behaviour(application).
-export([start/2, stop/1]).
-export([test/0]).

start(_Type, _Args) ->
log_utils:info("here at APP START 1"),
master_sup:start_link({10,20,30}).

stop(_State) ->
ok.

test() ->
log_utils:info("here at APP START 2"),
master_sup:start_link({10,20,30}).

然后我这样编译和测试:

1> application:start(test_app).
ok
2> test_app:test().
==INFO REPORT==== 27-Oct-2013::19:53:29 ===
"here at APP START 2"

期望的是 application:start(test_app) 将执行 start/2 函数并记录消息,与 test/0 函数类似。

事实上,我有一个更复杂的示例,其中我启动了一个主管,但类似地,我在应用程序模块中创建的 API 导致了一个错误,表明 start_link 不起作用。如果我调用一个启动主管的测试函数,那么它就可以工作。

最佳答案

您需要为 .app 文件添加一个额外选项,该文件提供应用程序回调模块和启动参数。没有隐式回调模块名称,如果没有给出则不会启动任何进程。选项是 {mod,{CallBackMod,StartArgs}} 所以整个 .app 文件将变成:

{application,test_app,
[{description,"Test App"},
{vsn,0.9},
{applications,[kernel,stdlib]},
{modules,[test_app,log_utils]},
{registered,[test_app]},
{mod,{test_app,[]}}]}.

第二个元素,在你的例子中,test_app 是应用程序的名称,而不是回调模块;他们不必相同。如果给出了回调,则在应用程序启动时将调用 Mod:start/2,在应用程序停止时将调用 Mod:stop/1

请注意,应用程序在启动时不必运行任何进程,例如 stdlib 应用程序就不需要。

您会在 Applications 中找到更好的描述.

关于Erlang Application start/2 不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19625802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com