IMPLEMENTACION DE SEMAFOROS EN UNA MESA REDONDA DE FILOSOFOS:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX8VIRJe6_CDC9PH9tUMX2TXt33C1cNGGFD6h-pAahjhloF5tBMg2W7cpBTSrqNTVWrZt6DDyxN0q9y214kNablOy3gNy5wqmmjj7p-z83dsLQJyeUlHAf7nAmN7OaDYyo64yIxxcfPly1/s400/exa+91.3.png)
#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