Erlang注册错误

问题描述:

我正在写一个程序,它将采取两个字符串并将它们连接为共享的Dropbox刺激。我使用的是其他应用程序的代码,它与联合银行帐户做了类似的事情,所以这些错误可能是因为我没有正确更改某行代码,但我无法弄清楚什么是错误的。Erlang注册错误

该代码被写入两个单独的文件,它们链接在一起,基本Dropbox是第一个,然后链接的代码,并显示答案如下。

-module(dropbox). 
-export([account/1, start/0, stop/0, deposit/1, get_bal/0, set_bal/1]). 

account(Balance) -> 
    receive 
     {set, NewBalance} -> 
      account(NewBalance); 
     {get, From} -> 
      From ! {balance, Balance}, 
      account(Balance); 
     stop -> ok 
    end. 

start() -> 
    Account_PID = spawn(dropbox, account, [0]), 
    register(account_process, Account_PID). 

stop() -> 
    account_process ! stop, 
    unregister(account_process). 

set_bal(B) -> 
    account_process ! {set, B}. 

get_bal() -> 
    account_process ! {get, self()}, 
    receive 
     {balance, B} -> B 
    end. 

deposit(Amount) -> 
    OldBalance = get_bal(), 
    NewBalance = OldBalance ++ Amount, 
    set_bal(NewBalance). 

-module(dropboxtest). 
-export([start/0, client/1]). 

start() -> 
    dropbox:start(), 
    mutex:start(), 
    register(tester_process, self()), 
    loop("hello ", "world", 100), 
    unregister(tester_process), 
    mutex:stop(), 
    dropbox:stop(). 

loop(_, _, 0) -> 
    true; 
loop(Amount1, Amount2, N) -> 
    dropbox:set_bal(" "), 
    spawn(dropboxtest, client, [Amount1]), 
    spawn(dropboxtest, client, [Amount2]), 
    receive 
     done -> true 
    end, 
    receive 
     done -> true 
    end, 
    io:format("Expected balance = ~p, actual balance = ~p~n~n", 
       [Amount1 ++ Amount2, dropbox:get_bal()]), 
    loop(Amount1, Amount2, N-1). 

client(Amount) -> 
    dropbox:deposit(Amount), 
    tester_process ! done. 

这是我得到,所有我已经设法找出其他的人的错误,但我不完全得到这一个,所以我不知道如何解决它。

** exception error: bad argument 
in function register/2 
    called as register(account_process,<0.56.0>) 
in call from dropbox:start/0 (dropbox.erl, line 16) 
in call from dropboxtest:start/0 (dropboxtest.erl, line 5) 

我也知道这是要拿出因并发问题的错误,我需要表现出这些错误,证明了什么问题之前,我可以修复它。有些功能还没有从银行程序更改,因此平衡等

the documentationregister可以badarg失败有很多原因:

  • 如果PidOrPort是不是现有的本地进程或端口。
  • 如果RegName已被使用。
  • 如果进程或端口已经注册(已经有一个名称)。如果RegName是原子undefined

在这种情况下,我怀疑这是第二个原因,因为已经有一个名为account_process的流程来自上一次运行。您可以尝试重新启动Erlang shell,或者您可以将中的spawn调用更改为spawn_link,这会在shell发生任何错误的情况下导致旧进程崩溃。

+0

我知道这会很简单!谢谢! –