Aula nº 9

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".

Estrutura em estrela

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.

aula9_anel.gif (3037 bytes)

OC 98-99 (Exercícios Práticos)


Estrela

-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 ).
Índice

Anel

-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.

Índice

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

OC 98-99 (Exercícios Práticos)