Erlang, register/2: 异常错误错误参数
Posted
技术标签:
【中文标题】Erlang, register/2: 异常错误错误参数【英文标题】:Erlang, register/2: exception error bad argument 【发布时间】:2016-05-04 17:21:39 【问题描述】:我想编写创建 2 个进程的程序。 第一个打印号码,将其发送到第二个过程,依此类推。 但是我的启动功能有问题。
-module(zad).
-export([start/0, one/0, two/0]).
one() ->
receive
go1, N ->
io:format("1 ~w~n", [N]),
two ! go2, N+1,
one();
go2, 50 ->
io:format("END ~w~n", [N+1]),
two ! finished
end.
two() ->
receive
finished ->
io:format("two finished~n", []);
go2, N ->
io:format("2 ~w~n", [N]),
one ! go1, N+1 ,
two()
end.
start() ->
register(two, spawn(zad, two, [])),
register(one, spawn(zad, one, [])),
one ! go1, 0.
这里有错误
** exception error: bad argument
in function register/2
called as register(two,<0.146.0>)
in call from zad:start/0 (zad.erl, line 29)
这是否意味着我不能在启动时注册 2 个进程?这段代码有什么问题?
更新 这真的很奇怪。但是在我改变之后
go2, 50 -> io:format("END ~w~n", [N+1]),
到
go2, 50 -> io:format("END ~w~n", [50]),
错误消失了。
这真的很奇怪,因为问题在one()
,但错误在register(two)
【问题讨论】:
也许two/0
也有语法错误?也许 two/0
的更改尚未编译,当您为 one/0
重新编译时,它已得到纠正?
你尝试过多少次运行这个?如果您在没有取消注册名称的情况下再次运行它,那么当您尝试重新注册名称时会出错,因为该名称已在使用中。
【参考方案1】:
您可以在start/0
中注册两个进程。这意味着您传递给register/2
的值是错误的。来自文档(http://erlang.org/doc/man/erlang.html#register-2):
失败:
badarg
如果 PidOrPort 不是现有的本地进程或端口。badarg
如果 RegName 已在使用中。badarg
如果进程或端口已经注册(已经有名字)。badarg
如果 RegName 是原子undefined
。
很可能发生的情况是进程在调用register/2
之前就死了(请参阅上面列表中的第一个失败)。
【讨论】:
以上是关于Erlang, register/2: 异常错误错误参数的主要内容,如果未能解决你的问题,请参考以下文章