Эта строка завершается с исключением badarg
:
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]).