
/***************************************************************
                        shmlib.c

 Esta livraria de funções permite de forma fácil e limitada
 aceder aos mecanismos de memória partilhada utilizados em Linux.
 Foi desenvolvida no âmbito da cadeira de Sistemas Operativos I,
 do Departamento de Engenharia Informatica do Instituto Superior
 de Engenharia do Porto, com objectivo de permiter aos alunos do
 1º Ano um primeiro contacto com a problemática da programação
 multitarefa em Linux.


 Versão:	1.0
 Data:		5 de Maio 2005

 Copyright:	Luis Lino Ferreira
 		llf@dei.isep.ipp.pt

***************************************************************/



#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>

/***************************************************************

                         ShmDef

 Permite obter uma zona privada (ao processo evocador e aos
 respectivos filho) de memória partilhada.

 Parâmetros:
 	size: comprimento da zona de memória partilhada em Bytes. Este
	parâmetro deve ter valor superior a zero.
	descr: descritor que identifica a zona de memória partilhada
	que foi criada.
 Saída
	Em caso de sucesso a função devolve um apontador para
	uma zona de memória partilhada.
	Em caso de erro é devolvido um apontador para NULL
	O parametro descr retorna o valor do descritor da memoria
	partilhada.
 Problemas e Limitações:
 	Em relação às funções standard de memória partilhada
	esta função apenas permite obter um zona de memória
	partilhada pelo processo evocador e respectivos filhos.


***************************************************************/


void *ShmDef(int size, int *descr)
{
 int 	descritor;
 int 	f;
 void 	*tst;

 //obtenção de um descriptor para a zona de memória partilhada
 descritor = shmget(IPC_PRIVATE, size, IPC_CREAT|0600);
 if (descritor == -1)
 {
	perror("Erro em shmget, ao alocar memória partilhada!");
	return(NULL);
 }
 else
 {
	/* Obtençao do apontador para a area de memoria partilhada */
	tst = (void *) shmat(descritor, NULL, 0);
	if ((int)tst == -1)
 	{
		perror("Erro em shmat, ao alocar memória partilhada!");
		return(NULL);
 	}

 } // fim do if
 *descr = descritor;
 return(tst);
}

/***************************************************************

                         ShmDel

 Permite libertar uma zona de memória partilhada. Note-se que esta
 apenas é apagada assim que mais nenhum processo a estiver a utilizar


 Parâmetros:
 	descr: descritor que identifica a zona de memória partilhada
	a libertar.
 Saída
	Em caso de sucesso a função devolve o valor zero.
	Em caso de erro é devolvido o valor -1.


***************************************************************/



int ShmDel(int descr)
{
 int res;

 res = shmctl(descr, IPC_RMID, NULL);
 if (res == -1)
 {
	perror("Erro em ShmDel!");
 }
 return(res);

}
