如何在Erlang中挂接到应用程序

qgelzfjb  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(159)

I do not understand how do you hook to an Erlang application since it does not return the Pid .
Consider for example the snippet below.I am starting a Pid which receives messages to process.However my application behaviour does not return anything. How do i hook to the Pid i am interested in when using application behaviour ?

.app

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

app

-module(simple_app).

-behaviour(application).

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

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

stop(_State) ->
    ok.

module

-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 I am trying to understand how do i get the root Pid to further use it to issue commands ? In my case i need the Pid of the proc:start module.If my root was a supervisor , i would need the Pid of the supervisor.The application does not return a Pid ? How do i hook to it ? The question thus is when starting the application wouldn't i need a Pid returned by it to then be able to issue commands against?

2uluyalo

2uluyalo1#

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

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

当您要启动应用程序时,你应该使用application模块,它是kernel应用程序的一部分。它启动一些进程来管理你的应用程序和I/O处理。它调用YOUR_APP:start(_, _),并且这个函数必须返回一个运行supervisor行为的Pid。我们通常称它为应用程序的根管理器。所以你必须定义一个application行为(如您所做的)和supervisor行为。此主管进程可能会启动您的工作进程,这些工作进程正在执行您的应用希望执行的任何操作。如果您要启动进程,你可以在你的管理模块中定义它的启动规范,所以内核启动你的应用,你的应用启动你的管理,你的管理启动你的工作者(s)。您可以用一个名称注册您的worker pid,并且可以使用它的名称向它发送消息。如果您有很多worker,您可以使用一个pid池来维护您的worker pid。
我认为使用spawn和spawn_link并手动向进程发送消息是可以的。但在生产代码中,我们通常不这样做。我们使用OTP行为,它们以可靠和干净的方式为我们做这些。
我认为最好写一些gen_server(另一种行为),并使用handle_callhandle_cast等回调函数。然后在一个监督树下运行一些gen_server,并使用监督API杀死或终止它的孩子,等等。然后开始写一个完整的应用程序。
请务必仔细阅读行为说明文件。

相关问题