首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >艾朗。停止进程的正确方法

艾朗。停止进程的正确方法
EN

Stack Overflow用户
提问于 2011-11-02 01:39:24
回答 3查看 11.7K关注 0票数 11

日安,我为我的小服务做了以下设置:

代码语言:javascript
复制
-module(mrtask_net).

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

-define(SERVER, mrtask_net).

start() ->
    Pid = spawn_link(fun() -> ?MODULE:listen(4488) end),
    register(?SERVER, Pid),
    Pid.

stop() ->
    exit(?SERVER, ok).

....

下面是repl的摘录:

代码语言:javascript
复制
(emacs@rover)83> mrtask_net:start().
<0.445.0>
(emacs@rover)84> mrtask_net:stop().
** exception error: bad argument
     in function  exit/2
        called as exit(mrtask_net,ok)
     in call from mrtask_net:stop/0
(emacs@rover)85> 

正如您所看到的,停止进程会产生错误,但是进程正在停止。这个错误是什么意思,以及如何让事情变得干净?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-02 01:51:44

我不是一名Erlang程序员,仅从exit (here)的文档中可以看出,exit需要一个进程id作为第一个参数,而您向它传递的是一个原子(?SERVER)。

试一试

代码语言:javascript
复制
exit(whereis(?SERVER), ok).

相反(参见herewhereis返回与名称相关联的进程id )

票数 21
EN

Stack Overflow用户

发布于 2011-11-02 16:26:39

正如@MartinStettner指出的那样,您需要更改对exit/2的调用。该进程停止的原因是您已经使用spawn_link启动了该进程。然后将您的进程链接到shell进程。当您调用mrtask_net:stop()时,该错误导致shell进程崩溃,然后在它们链接时导致您的进程崩溃。然后会自动启动一个新的shell进程,以便您可以继续使用该shell。您通常希望使用spawn_link启动服务器,但当您从shell测试它们时,它们“碰巧”就死了,这可能会导致混淆。

票数 4
EN

Stack Overflow用户

发布于 2011-11-03 02:33:51

我建议你坚持使用OTP。它真的给你带来了很多好处(我很难想象OTP不会受益的情况)。

因此,如果您想在动态口令中停止进程,您应该对gen_server执行如下操作

代码语言:javascript
复制
% process1.erl
% In case you get cast message {stopme, Message}
handle_cast({stopme, Message}, State) ->
    % you will stop
    {stop, normal, State}
handle_cast(Msg, State) ->
    % do your stuff here with msg
    {noreply, State}.

% process2.erl
% Here the code to stop process1
gen_server:cast(Pid, {stopme, "It's time to stop!"}),

有关它的更多信息,请单击此处:http://www.erlang.org/doc/man/gen_server.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7970456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档