这条线失败,并badarg
例外:Erlang:为什么我不能注册self()?
register(myproc, self()),
文档说self/0
返回一个PID和register/2
需要一个pid。那么是什么给了?
编辑:不,严重的是,它还没有被注册,它不是一个保留的原子,并且当我从产生它的进程中注册它时,它工作。
哦,太奇怪了!好的,我有更多的线索。当我将呼叫转移到register()
到不同的地方时,有时它会起作用,有时会中断。这是我的示例代码。在你叫我疯狂之前运行它。 :-)
-module(pingpong).
-export([start/1, ping/2, pong/0]).
ping(N, Pong_Pid) ->
link(Pong_Pid),
pingr(N, Pong_Pid).
pingr(0, _) ->
io:format("Ping exiting~n", []),
exit(ping);
pingr(N, Pong_Pid) ->
Pong_Pid ! {ping, self()},
receive
pong ->
io:format("Ping received pong~n", [])
end,
pingr(N - 1, Pong_Pid).
pong() ->
%% This one works.
%%register(pong, self()),
process_flag(trap_exit, true),
pongr().
pongr() ->
%% This one fails.
register(pong, self()),
receive
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,
pongr();
{'EXIT', From, Reason} ->
io:format("pong exiting, got ~p~n", [{'EXIT', From, Reason}])
end.
start(Ping_Node) ->
PongPID = spawn(pingpong, pong, []),
spawn(Ping_Node, pingpong, ping, [3, PongPID]).
如果我没有先阅读文档,我不会来。 – 2011-03-17 21:26:53
对不起,我不是故意要冒犯你。请参阅我编辑的答案,了解代码中的问题说明。 – knutin 2011-03-17 22:32:19
Ohhhhhh,DUH !!!我几乎尴尬,我以前没有看到它。此外,谢谢你的奖金提示和效率链接。 – 2011-03-18 03:22:41