2011-11-01 57 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

相關問題