martes, 4 de octubre de 2011

EJERCICIO DE EXAMEN

IMPLEMENTACION DE SEMAFOROS EN UNA MESA REDONDA DE FILOSOFOS:

#include <rshmem.h>
#include <sys/sem.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define M 50 
#define N 5
incrementa (int *mem, int k){
int i;
i=*mem;
TP ; TP ; TP TP ;
TP ; TP TP ; TP ;
TP TP ; TP ; TP
i=i+k;
TP ; TP ; TP TP ;
TP ; TP TP ; TP ;

TP TP ; TP ; TP

*mem=i;


filosofo(FILE *pf, key_t *sclave, int *sfilo, int i, int *comer, int *fin, int *fc){


if (-1==(sfilo[i]=semOpen(sclave[i])))
fprintf(stderr,"no tengo el cualificador del semaforo filosofo %d\n",i);

if (-1==(sfilo[(i+2)%N]=semOpen(sclave[(i+2)%N])))
fprintf(stderr,"no tengo el cualifacador semaforo filosofo %d\n",(i+2)%N);

while(*comer<M){
semWait(sfilo[i]);
(*fc)++;
if (*fc>(N+1)/2)  
   {
   semSignal(sfilo[i]);
   (*fc)--;
   }

else
   {
   semWait(sfilo[(i+2)%N]);
   incrementa(comer,1);

   (void) fprintf(pf,"[comer:%.2d] el filosofo %d ha comido\n", *comer, (i+1)%N);
   fflush(pf);

   semSignal(sfilo[(i+2)%N]);
   semSignal(sfilo[i]);
   (*fc)--;
   }
}
semClose(sfilo[i]);
semClose(sfilo[(i+2)%N]);
(*fin)++;
exit(1);
}

int main(){

FILE *pf;           
key_t sclave[N+1];  
int sfilo[N];       
int *comer;          
int *fin;           
int *fc;            
int i;              

printf("1");


if((pf=fopen("fich", "w+"))==NULL){

fprintf(stderr,"error al abrir el fichero para salidas\n");
exit(-1);
}

printf("abre fichero salida");

for(i=0; i<N; i++){
printf("el for ");
/*crear nombres claves filosofos */

if((key_t)-1==(sclave[i]=ftok("filos",'s'+i))){
fprintf(stderr,"main: error crear clave filosofo %d con ftok(%c)\n", i,'s'+i);
exit(1);
}

print("dentro del fo");
if(-1==(sfilo[i]=semCreate(sclave[i],1))){
fprintf(stderr,"main: no pude crear semaforo filosofo %d\n",i);
exit(1);
}
}    if(!crearMemoria())
fprintf(stderr,"error de crearMemoria()\n");

comer = (int *) memoria;
*comer = 0;
fin = (int *) comer + sizeof(int);
*fin = 0;
fc = (int *) comer + sizeof(int);

for(i=0; i<N; i++){
if(0==fork())   
filosofo(pf, sclave, sfilo, i, comer, fin, fc);
}

while(*fin<5);
fprintf(pf,"no habia comido ningun filososo y ahora han comido %d", *comer);
fclose(pf);

if(!eliminarMemoria())
fprintf(stderr,"error de eliminarMemoria()\n");

for(i=0; i<N; i++)
semClose(sfilo[i]);
exit(0);
}

No hay comentarios:

Publicar un comentario