2011-11-01 149 views
10

你好,我有以下设置为我的小服务:Erlang。正确的方法来阻止过程

-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摘录:

([email protected])83> mrtask_net:start(). 
<0.445.0> 
([email protected])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 
([email protected])85> 

正如你看到的,停车过程中产生的误差,工艺正在停止。 这个错误意味着什么,以及如何让事情变得清洁?

回答

20

并非是一个Erlang程序员和刚刚从exithere)的文件,我会说,那exit需要一个过程id作为第一个参数,而你传递一个原子(?SERVER)给它。

尝试

​​

代替(whereis返回与名称相关联的进程ID,请参阅here

+6

+1能够阅读的文档可就像知道一种语言一样有价值。 – BRampersad

4

您需要调用更改为exit/2作为@MartinStettner指出。无论如何,这个过程停止的原因是你已经开始使用spawn_link。您的进程然后链接到shell进程。当您调用mrtask_net:stop()时,该错误导致shell进程崩溃,从而导致进程在链接时崩溃。然后一个新的shell进程会自动启动,所以你可以继续使用shell。你通常想用spawn_link来启动你的服务器,但是当你从shell中测试它们并且它们只是“发生”死的时候会引起混淆。

2

我建议你坚持使用OTP。它确实给你带来了很多好处(我几乎不可能在OTP不受益的情况下放弃这种情况)。

所以,如果你想在OTP停止过程中,你应该为gen_server做这样的事情:

% 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