你如何挂钩到 Erlang 中的应用程序

How do you hook to an application in Erlang

我不明白你如何连接到 Erlang 应用程序,因为它不 return Pid

考虑例如片段 below.I 正在启动一个 Pid 接收消息到 process.However 我的 application 行为没有 return 任何东西。 在使用 application 行为时,如何挂钩到我感兴趣的 Pid

.app

{
  application,simple_app,
  [
    {description,"something"},
    {mod,{simple_app,[]}},
    {modules,[proc]}
  ]
}

应用程序

-module(simple_app).

-behaviour(application).

-export([start/2, stop/1]).

start(_StartType, _StartArgs) ->
    proc:start().

stop(_State) ->
    ok.

模块

-module(proc).
-export([start/0]).

start()->
    Pid=spawn_link(?MODULE,loop,[]),
    {ok,Pid}.

loop()->
    receive 
        {From,Message}-> From !  {ok,Message},
                         loop();
        _ ->loop()
    end.

P.S 我想了解如何获取根 Pid 以进一步使用它来发出命令?就我而言,我需要 proc:start module.If 的 Pid 我的根是主管,我需要 supervisor.The 应用程序的 Pid return一个Pid?我如何挂钩它? 因此,问题是当启动应用程序时,我不需要 Pid return 来发出命令吗?

您的应用程序必须依赖于 kernelstdlib。您应该在 .app 文件中定义它们的名称,例如:

{
  application,simple_app,
  [
    {description,"something"},
    {mod,{simple_app,[]}},
    {modules,[proc]},
    {applications, [kernel, stdlib]}
  ]
}

当你想启动你的应用程序时,你应该使用 application 模块,它是 kernel 应用程序的一部分。 它会启动一些进程来管理您的应用程序和 I/O 处理。它调用 YOUR_APP:start(_, _) 并且此函数必须 return 一个 Pid,它 运行 宁 supervisor 行为。我们常称它为app的root supervisor。 所以你必须定义一个 application 行为(就像你所做的那样)和一个 supervisor 行为。 这个主管进程可能会启动你的工作人员,他们正在做你的应用程序想做的任何事情。 如果你想启动一个进程,你可以在你的主管模块中定义它的启动规范。所以内核启动你的应用程序,你的应用程序启动你的主管,你的主管启动你的工人。 您可以使用名称注册您的 worker pid,并且可以使用其名称向其发送消息。 如果你有很多工人,你可以使用一个 pids 池来维护你的工人 pids。

我认为可以使用 spawn 和 spawn_link 并手动向进程发送消息。但是在生产代码中我们通常不会这样做。我们使用 OTP 行为,他们以可靠和干净的方式为我们做这件事。

我认为最好写一些 gen_servers(另一种行为)并使用 handle_callhandle_cast 等回调。然后 运行 一些 gen_server 在监督树下并与监督者 API 一起杀死或终止其 children 等。然后开始编写完整的应用程序。

记得仔细阅读行为文档。