Exercício 8


Enunciado

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

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

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


Solução

-module(exercicio8).
-export([start/2,node/1]).

start(NMsg,NProc) ->
	Pids=criar_nodes(NProc),
	enviar_mensagens(NMsg,Pids),
	enviar_mensagem_fim(Pids).

criar_nodes(NProcs) ->
	criar_nodes(NProc,[]).

criar_nodes(0,Pids) ->
	Pids;
criar_nodes(N,Pids) ->
	P=spawn(exercicio8,node,[self()]),
	criar_nodes(N-1,[P|Pids]).

enviar_mensagens(0,_) ->
	ok;
enviar_mensagens(NMsg,Pids) ->
	envia_para_todos(Pids),
	enviar_mensagens(NMsg-1,Pids).

envia_para_todos([]) ->
	ok;
envia_para_todos([P|Pids]) ->
	P ! ola,
	receive
		{P,ola} -> ok
	end,
	envia_para_todos(Pids).

enviar_mensagem_fim([]) ->
	ok;
enviar_mensagem_fim([P|Pids]) ->
	P ! fim,
	receive
		{P,'ok fim'} -> ok
	end,
	enviar_mensagem_fim(Pids).

node(Pids_start) ->
	receive
		ola ->
			Pid_start ! {self(),ola},
			node(Pid_start);
		fim ->
			Pid_start ! {self(),'ok fim'}
	end.

Última actualização: 18-05-2000

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