Erlang,register / 2:异常错误坏参数

时间:2016-01-27 16:26:29

标签: erlang

我想编写创建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)

1 个答案:

答案 0 :(得分:2)

您可以在start/0中注册两个流程。这意味着您传入register/2的值是错误的。从文档(http://erlang.org/doc/man/erlang.html#register-2):

  

故障:

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

可能发生的事情是在调用register/2之前该过程已经死亡(请参阅上面列表中的第一个失败)。