关于erlang:link的一个死循环-有空研究


在做实验的过程中偶然遇见了这个问题
 
 
参数传递错误
link(1).
** exception error: bad argument
     in function  link/1
        called as link(1)
 
       link(Pid).
        Pid存在的话返回true,否者返回
         ** exception error: no such process or port
         in function  link/1
         called as link(<0.107.0>)
 
而如果我们又这样的一段代码(如下),在init中link一个进程,而当前进程挂载在supervisor下面,当link进程死掉的时候,自身重启,但是在init的地方又link原来死掉的进程
这个时候此进程就会一直重启下去,奇怪的是为什么可以起来,添加输出,显示link原来已经死掉的进程返回的是true,但是会不断地收到link进程死掉的消息
server2 receive exit:noproc, From:<0.97.0>,所以死循环产生了
 
start(X) ->
    supervisor:start_child(e_test_sup2,
                       {lists:concat(["ee",X]),
                        {e_test_server2, start_link, []},
                        permanent, 30000, worker, [e_test_server2]}).
 
start(X, LinPid) ->
    supervisor:start_child(e_test_sup2,
                       {lists:concat(["ee",X]),
                        {e_test_server2, start_link, [LinPid]},
                        permanent, 30000, worker, [e_test_server2]}).
 
start_link() ->
    gen_server:start_link(?MODULE, [], []).
start_link(LinkPid) ->
    gen_server:start_link(?MODULE, [LinkPid], []).
 
init([]) ->
    erlang:process_flag(trap_exit, true),
    {ok, #state{}};
init([LinkPid]) ->
    erlang:process_flag(trap_exit, true),
    W = link(LinkPid),
    ?T("+++++~p,~p",[LinkPid,W]),
    {ok, #state{}}.

posted on 2012-08-17 11:24  fangjie008  阅读(359)  评论(0编辑  收藏  举报

导航