Exercício 9


Enunciado

Modelize um sistema distribuído, apresentando o modelo operacional e de setup, respeitante à seguinte descrição:

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.

Escreva um módulo em Erlang respeitante ao modelo anterior.


Solução

-module(exercicio9).
-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: 18-05-2000

OC 1999/2000 (Exercícios Práticos)