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 documentation,register
可以badarg
失败有很多原因:
- 如果
PidOrPort
是不是现有的本地进程或端口。 - 如果
RegName
已被使用。 - 如果进程或端口已经注册(已经有一个名称)。如果
RegName
是原子undefined
。
在这种情况下,我怀疑这是第二个原因,因为已经有一个名为account_process
的流程来自上一次运行。您可以尝试重新启动Erlang shell,或者您可以将中的spawn
调用更改为spawn_link
,这会在shell发生任何错误的情况下导致旧进程崩溃。
我知道这会很简单!谢谢! –