Escrever um módulo em Erlang que modele um sistema de comunicações com estrutura em estrela.
O nó central envia n mensagens a m nós criados dinamicamente (aquando
do arranque). O nó central envia uma mensagem "hello" e recebe uma
outra "hello" do nó. Repete o processo n vezes. Quando
terminarem estas mensagens, o nó central envia uma mensagem de término "fim"
a cada um dos outros nós, que os fará sair "graciosamente".

Desenvolva outro módulo para uma estrutura em anel, ou seja, cada nó recebe uma mensagem do anterior e envia para o seguinte. O processo repete-se n vezes e termina com a mensagem de fim.

-module(aula9_estrela). -export([estrela/2,no_estrela/0]). estrela( N_msg, M_nos) -> % como este proprio processo conta como no, % entao apenas se criam M - 1 processos L = criar_nos_estrela( M_nos - 1, [] ), enviar_msgs_estrela( N_msg, L ).
criar_nos_estrela( 0, L) -> L; criar_nos_estrela( N, L) -> criar_nos_estrela( N-1,[ spawn(?MODULE, no_estrela,[]) | L ] ).
no_estrela()->
receive
{ Pid, hello } ->
io:format("~w recebeu hello~n", [self()] ),
Pid ! hello,
no_estrela() ;
fim ->
io:format("~w recebeu fim~n", [self()] )
end.
enviar_msgs_estrela( 0, L ) ->
enviar_msgs_estrela_fim( L );
enviar_msgs_estrela( M, L ) ->
enviar_msg_estrela( L ),
enviar_msgs_estrela( M-1, L ).
enviar_msg_estrela( [] ) -> true;
enviar_msg_estrela( [ Pid | L ] )->
Pid ! { self(), hello },
receive
hello -> true
end,
enviar_msg_estrela( L ).
enviar_msgs_estrela_fim( [] ) -> true; enviar_msgs_estrela_fim( [ Pid | L ] ) -> Pid ! fim, enviar_msgs_estrela_fim( L ).
-module(aula9_anel).
-export([anel/2, no_anel/1]).
anel(N_msg, M_nos) ->
% como este proprio processo conta como no,
% entao apenas se criam M - 1 processos
Pid_seguinte = criar_nos_anel( M_nos - 1, self() ),
enviar_msgs_anel( N_msg, Pid_seguinte ).
criar_nos_anel( 0, Pid_seguinte ) ->
Pid_seguinte;
criar_nos_anel( M, Pid_seguinte ) ->
Pid_anterior = spawn( ?MODULE, no_anel, [ Pid_seguinte ] ),
criar_nos_anel( M-1, Pid_anterior ).
no_anel( Pid_seguinte ) ->
receive
hello ->
Pid_seguinte ! hello,
io:format("msg. hello para ~w~n", [Pid_seguinte]),
no_anel( Pid_seguinte );
fim ->
% termina processo
Pid_seguinte ! fim,
io:format("terminar ~w~n",[self()])
end.
enviar_msgs_anel( 0, Pid_seguinte ) ->
enviar_msg_anel_fim( Pid_seguinte );
enviar_msgs_anel( N, Pid_seguinte ) ->
Pid_seguinte ! hello,
receive
hello ->
enviar_msgs_anel( N-1, Pid_seguinte )
end.
enviar_msg_anel_fim( Pid_seguinte ) ->
Pid_seguinte ! fim,
receive
fim ->
io:format("todos terminaram~n",[])
end.

Última actualização: 14 Março 2000