#include"rshmem.h"
#include<sys/sem.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int tiempoEspera(int landa)
{
double p;
p=((double)rand())/RAND_MAX;
return((int) -(log(p)*landa); */
}
void estadisticas(int *mem,int k)
{
int i;
int total=0;
int ayuda=0;
for (i=1;i<=7;i++)
{
printf("Tiempo en el proceso %d entre las plantas %d-%d : %d \n",i,k-10,k,*(mem+i));
total=*(mem+i)+total;
*(mem+i)=0;
}
printf("Tiempo medio por proceso entre las plantas %d-%d : %.3f\n",k-10,k,((float)total)/70);
ayuda=*(mem)+total;
*(mem)=ayuda;
printf("Tiempo medio por planta : %.3f\n",((float)ayuda)/(k));
}
void incrementa (int *valor, int x, int proceso)
{
int ayuda=0;
ayuda=*(valor+proceso);
ayuda=ayuda+x;
*(valor+proceso)=ayuda;
}
int main()
{
key_t claveCimientos, clavePiso, claveElectricidad, claveTecho,
claveVentana, clavePintar, claveAcabado;
int *tiempo;
int cimientos, piso, electricidad, techo, ventana, pintar,
acabado;
char *marcaFin;
int k;
time_t semilla;
if((key_t) -1==(claveCimientos=ftok("ej2",'a')))
{
fprintf(stderr,"main:Error al crear claveCimientos con ftok()\n");
exit(1);
}
if((key_t) -1==(clavePiso=ftok("ej2",'b')))
{
fprintf(stderr,"main:Error al crear clavePisoA con ftok()\n");
exit(1);
}
if((key_t) -1==(claveElectricidad=ftok("ej2",'f')))
{
fprintf(stderr,"main:Error al crear claveElectricidad con ftok()\n");
exit(1);
}
if((key_t) -1==(claveTecho=ftok("ej2",'g')))
{
fprintf(stderr,"main:Error al crear claveTecho con ftok()\n");
exit(1);
}
if((key_t) -1==(claveVentana=ftok("ej2",'h')))
{
fprintf(stderr,"main:Error al crear claveVentana con ftok()\n");
exit(1);
}
if((key_t) -1==(clavePintar=ftok("ej2",'i')))
{
fprintf(stderr,"main:Error al crear clavePintar con ftok()\n");
exit(1);
}
if((key_t) -1==(claveAcabado=ftok("ej2",'j')))
{
fprintf(stderr,"main:Error al crear claveAcabado con ftok()\n");
exit(1);
}
/* Creacion de los semaforos */
if(-1==(cimientos=semCreate(claveCimientos,0)))
{
fprintf(stderr,"main:No puede crear el semaforo CIMIENTOS\n");
exit(1);
}
if(-1==(piso=semCreate(clavePiso,0)))
{
fprintf(stderr,"main:No puede crear el semaforo PISOA\n");
exit(1);
}
if(-1==(electricidad=semCreate(claveElectricidad,0)))
{
fprintf(stderr,"main:No puede crear el semaforo ELECTRICIDAD\n");
exit(1);
}
if(-1==(techo=semCreate(claveTecho,0)))
{
fprintf(stderr,"main:No puede crear el semaforo TECHO\n");
exit(1);
}
if(-1==(ventana=semCreate(claveVentana,0)))
{
fprintf(stderr,"main:No puede crear el semaforo VENTANA\n");
exit(1);
}
if(-1==(pintar=semCreate(clavePintar,0)))
{
fprintf(stderr,"main:No puede crear el semaforo PINTAR\n");
exit(1);
}
if(-1==(acabado=semCreate(claveAcabado,1)))
{
fprintf(stderr,"main:No puede crear el semaforo ACABADO\n");
exit(1);
}
srand((unsigned)time(&semilla));
/* Creacion de la zona de memoria compartida */
if(!crearMemoria())
fprintf(stderr,"error de crearMemoria()\n");
tiempo=(int *)memoria; /* Variable seccion compartida */
marcaFin=memoria+(8*sizeof(int));
for(k=0;k<8;k++)
*(tiempo+0)=0;
*marcaFin='p';
if(0!=fork()) /* Proceso cimientos (padre) */
{
int p=0;
int j;
int tdp=0;
for(j=1;j<=100;j++) /* Numero de cimientos a construir */
{
semWait(acabado); /* Espera por el proceso de acabado */
tdp=tiempoEspera(20);
incrementa(tiempo,tdp,1); /* generacion del tiempo de espera para el
proceso de cimientos */
while(p<tdp) /* Espera por la duracion del proceso */
p++;
semSignal(cimientos); /* Segnal del semaforo cimientos */
}
while(*marcaFin!='b'); /* Espera por el proceso piso */
if (!eliminarMemoria()) /* Eliminacion de la memoria */
fprintf(stderr,"error de eliminarMemoria()\n");
semClose(acabado); /* Clausura de semaforos */
semClose(cimientos);
semClose(electricidad);
semClose(ventana);
semClose(piso);
semClose(techo);
semClose(pintar);
exit(0);
}
else
{
if(0!=fork()) /* Proceso piso */
{
int p=0;
int j;
int tdp=0;
if(-1==(cimientos=semOpen(claveCimientos))) /* Apertura de semaforos*/
fprintf(stderr,"No tengo el cualificador de cimientos\n");
if(-1==(piso=semOpen(clavePiso))) /* Apertura de semaforos*/
fprintf(stderr,"No tengo el cualificador de pisoA\n");
for(j=1;j<=100;j++) /* Numeros de piso a contruir */
{
semWait(cimientos); /* Espera por la segnal de cimientos */
tdp=tiempoEspera(15);
incrementa(tiempo,tdp,2); /* generacion del tiempo de espera para el
proceso de cimientos */
while(p<tdp) /* Espera por la duracion del proceso */
p++;
semSignal(piso);
}
while(*marcaFin!='c'); /* Espera por el proceso electricidad */
semClose(piso);
semClose(cimientos); /* Clausura de semaforos */
*marcaFin='b';
exit(0);
}
else
{
if(0!=fork()) /* Proceso electricidad */
{
int p=0;
int j;
int tdp=0;
if(-1==(piso=semOpen(clavePiso))) /* Apertura de semaforos */
fprintf(stderr,"No tengo el cualificador de pisoA\n");
if(-1==(electricidad=semOpen(claveElectricidad))) /* Apertura de semaforos
*/
fprintf(stderr,"No tengo el cualificador de piso\n");
for(j=1;j<=100;j++) /* Numero de tendido electrico a colacar */
{
semWait(piso); /* Espera por la segnal de piso */
tdp=tiempoEspera(24);
incrementa(tiempo,tdp,3); /* generacion del tiempo de espera para el
proceso de cimientos */
while(p<tdp) /* Espera por la duracion del proceso */
p++;
semSignal(electricidad); /* Segnal del semaforo electricidad */
}
while(*marcaFin!='d'); /* Espera por el proceso techo */
semClose(piso); /* Clausura de semaforos */
semClose(electricidad);
*marcaFin='c';
exit(0);
}
else
{
if(0!=fork()) /* Proceso techo */
{
int p=0;
int j;
int tdp=0;
if(-1==(electricidad=semOpen(claveElectricidad))) /* Apertura de semaforos
*/
fprintf(stderr,"No tengo el cualificador de piso\n");
if(-1==(techo=semOpen(claveTecho))) /* Apertura de semaforos */
fprintf(stderr,"No tengo el cualificador de techo\n");
for(j=1;j<=100;j++) /* Numero de techos a contruir */
{
semWait(electricidad); /* Espera por la segnal de personal */
tdp=tiempoEspera(16);
incrementa(tiempo,tdp,4); /* generacion del tiempo de espera para el
proceso de cimientos */
while(p<tdp) /* Espera por la duracion del proceso */
p++;
semSignal(techo); /* Segnal del semaforo techo */
}
while(*marcaFin!='e'); /* Espera por el porceso ventana */
semClose(techo);
semClose(electricidad);
*marcaFin='d';
exit(0);
}
else
{
if(0!=fork()) /* Proceso ventana */
{
int p=0;
int j;
int tdp=0;
if(-1==(ventana=semOpen(claveVentana)))
fprintf(stderr,"No tengo el cualificador de ventana\n");
if(-1==(techo=semOpen(claveTecho))) /* Apertura de semaforos */
fprintf(stderr,"No tengo el cualificador de techo\n");
for(j=1;j<=100;j++) /* Numero de ventanas a poner */
{
semWait(techo); /* Espera por la segnal de personal */
tdp=tiempoEspera(10);
incrementa(tiempo,tdp,5); /* generacion del tiempo de espera para el
proceso de cimientos */
while(p<tdp) /* Espera por la duracion del proceso */
p++;
semSignal(ventana); /* Segnal del semaforo ventana */
}
while(*marcaFin!='f'); /* Espera por el proceso pintar */
semClose(ventana);
semClose(techo);
*marcaFin='e';
exit(0);
}
else
{
if(0!=fork()) /* Proceso pintar */
{
int p=0;
int j;
int tdp=0;
if(-1==(ventana=semOpen(claveVentana)))
fprintf(stderr,"No tengo el cualificador de ventana\n");
if(-1==(pintar=semOpen(clavePintar)))
fprintf(stderr,"No tengo el cualificador de pintar\n");
for(j=1;j<=100;j++) /* Numero de pisos a pintar */
{
semWait(ventana); /* Espera por la segnal de ventana */
tdp=tiempoEspera(7);
incrementa(tiempo,tdp,6); /* generacion del tiempo de espera para el
proceso de cimientos */
while(p<tdp) /* Espera por la duracion del proceso */
p++;
semSignal(pintar); /* Segnal del semaforo pintar */
}
while(*marcaFin!='g'); /* Espera por el proceso acabado */
semClose(pintar); /* Clausura de semaforos */
semClose(ventana);
semClose(electricidad); /* Clausura de semaforos */
semClose(techo);
*marcaFin='f';
exit(0);
}
else
{
int p=0;
int j;
int tdp=0;
if(-1==(pintar=semOpen(clavePintar)))
fprintf(stderr,"No tengo el cualificador de pintar\n");
if(-1==(acabado=semOpen(claveAcabado)))
fprintf(stderr,"No tengo el cualificador de pintar\n");
for(j=1;j<=100;j++)
{
semWait(pintar);
tdp=tiempoEspera(11);
incrementa(tiempo,tdp,7); /* generacion del tiempo de espera para el
proceso de cimientos */
while(p<tdp)
p++;
if((j%10)==0)
estadisticas(tiempo,j);
semSignal(acabado);
}
semClose(pintar);
semClose(acabado);
*marcaFin='g';
exit(0);
}
}
}
}
}
}
}
Volver a la página inicial