Preventing multiple instances through register/2
Richard Carlsson
richardc@REDACTED
Mon May 15 09:16:56 CEST 2006
Jeff Crane wrote:
> Can anyone explain to me why the atom
> already_registered does not echo to the screen, but
> the io:format (commented out) does?
If you do as in your example:
already_registered,
io:format(" test_server:already registered:~p~n",[Err]),
%% Kill spawned process, via msg
Pid ! exit;
then the final value (which is echoed to the screen when
you run the code from the shell) is that of the last expression,
namely 'Pid ! exit' (and the value of that is just 'exit').
When you run several expressions separated by comma, all the
results except the last are thrown away. This should work:
io:format(" test_server:already registered:~p~n",[Err]),
%% Kill spawned process, via msg
Pid ! exit,
already_registered;
*But* you are still doing the registration from the "wrong"
process, which makes it more complicated than it needs to be.
Try something like this:
start() ->
Pid = spawn(?MODULE, process, [self()] end),
receive
{Pid, Result} -> Result
end.
process(Parent) ->
case catch register(test_server, self()) of
true ->
Parent ! {self(), ok},
start_work();
_ ->
Parent ! {self(), error},
exit(error)
end.
start_work(...) -> ...
> Without registering, how do you send messages to a PID
> from the command line?
You can do something like this:
1> Pid = spawn(mymodule, myprocessfunction, [1,2,3]).
2> Pid ! message.
but if you don't know the Pid, then you don't know it.
Look at it as a sort of access control.
/Richard
More information about the erlang-questions
mailing list