#include "rshmem.h" #include #include #include #include #define N 5 /* tomo 5, como un numero generico de filosofos */ #define M 50 /* numero total de veces que comen los filosofos */ /************************************************************************/ /* Declaracion de la funcion incrementa */ 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; } /* Declaracion de la funcion filosofo: uso de semaforos */ filosofo(FILE *pf, key_t *sclave, int *sfilo, int i, int *comer, int *fin, int *fc){ /* ABRIR SEMAFOROS */ /*Abrir semaforo del filosofo de la izquierda del que desea comer */ if (-1==(sfilo[i]=semOpen(sclave[i]))) fprintf(stderr,"no tengo el cualificador del semaforo filosofo %d\n",i); /*Abrir semaforo del filosofo de la derecha del que desea comer */ if (-1==(sfilo[(i+2)%N]=semOpen(sclave[(i+2)%N]))) fprintf(stderr,"no tengo el cualifacador semaforo filosofo %d\n",(i+2)%N); /* COMER M VECES */ while(*comer(N+1)/2) /* mira si mas de la mitad de los filosofos estan intentando comer */ { 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); /* para sincronizar la escritura de datos en el fichero de salida */ semSignal(sfilo[(i+2)%N]); semSignal(sfilo[i]); (*fc)--; } } /* CERRAR SEMAFOROS Y TERMINAR */ semClose(sfilo[i]); semClose(sfilo[(i+2)%N]); (*fin)++; exit(1); } /**************************************************************************/ /* */ /* FUNCION PRINCIPAL */ /* */ /**************************************************************************/ int main(){ FILE *pf; /* puntero a fichero salida */ key_t sclave[N+1]; /* array de claves para semaforos */ int sfilo[N]; /* un semaforo por filosofo */ int *comer; /* variable de memoria compartida */ int *fin; /* variable de memoria compartida */ int *fc; /* variable de memoria compartida */ int i; /* contador */ printf("1"); /* Abrir fichero de salida */ if((pf=fopen("fich", "w+"))==NULL){ fprintf(stderr,"error al abrir el fichero para salidas\n"); exit(-1); } printf("abre fichero salida"); /* SEMAFOROS PARA FILOSOFOS */ for(i=0; i