IMPLEMENTACIÓN DE LA FUNCIÓN PRINCIPAL
#include "funcion.c"
int main( ){
- FILE *pf; /*puntero a fichero de salida*/
- key_t clavePastelero[3], /*array cualificadores de semáforos
pastelero*/
- claveAgente; /*cualificador semáforo agente*/
- int spastelero[3], /*array semáforos pastelero*/
- sagente; /*semáforo agente*/
- int i;
- int *pastel=NULL; /*punteros a variables */
- char *fin=NULL; /* compartidas */
- time_t t;
- /*Abrimos el fichero de salida*/
- if((NULL==(pf=fopen("salida","w+")))){
- fprintf(stderr,"main:Error al abrir el fichero de salida\n");
- exit(1);
- }
- /*SEMÁFOROS*/
- /*Clave para semáforo agente*/
- if((key_t) -1==(claveAgente=ftok("ho",'s'))){
- fprintf(stderr,"main:Error al crear la clave de sagente\n");
- fclose(pf);
- exit(1);
- }
- /*Creamos semáforo sagente asignando valores iniciales*/
- if(-1==(sagente=(semCreate(claveAgente,0)))){
- fprintf(stderr,"main:No puede crear el semaforo sagente\n");
- fclose(pf);
- exit(1);
- }
- /*Clave para semáforos pasteleros*/
- for(i=0;i<3;i++){
- if((key_t) -1==(clavePastelero[i]=ftok("ho",'s'+i+1))){
- fprintf(stderr,"main:Error al crear las claves de
- spastelero[%d] con ftok(%c)\n",i,'s'+i+1);
- fclose(pf);
- semClose(sagente);
- fflush(stderr);
- exit(1);
- } /* fin de if*/
- } /* fin de for*/
- /*Creamos semáforos spastelero asignando valores iniciales*/
- for(i=0;i<3;i++){
- if(-1==(spastelero[i]=semCreate(clavePastelero[i],0))){
- fprintf(stderr,"main:No puede crear el sem foro spastelero[%d]\n",i);
- fclose(pf);
- semClose(sagente);
- if(i==1)
- if(i==2){
- semClose(spastelero[0]);
- semClose(spastelero[1]);
- }
- exit(1);
- } /*fin de if*/
- } /*fin de for*/
- /*CREAR LA ZONA DE MEMORIA COMPARTIDA*/
- if(!crearMemoria()){
- fprintf(stderr,"Error al crear memoria\n");
- fflush(stderr);
- for(i=0;i<3;i++)
- semClose(sagente);
- fclose(pf);
- exit(1);
- }
- /*Variables de la sección crítica*/
- pastel=(int*)memoria;
- fin=memoria+sizeof(int);
- (*pastel)=1;
- for(i=0;i<3;i++)
- /* Ponemos semilla en el generador de números aleatorios*/
- srand((unsigned) time (&t));
- if(0!=fork( )){ /*proceso padre, el agente*/
- int faltaIngrediente;
- while((*pastel)<N){
- /*generar el ingrediente que falta*/
- faltaIngrediente=generarIngrediente();
- fprintf(pf,"Avisar al pastelero [%d]\n",faltaIngrediente);
- fflush(pf);
- /*Avisar al pastelero correspondiente*/
- semSignal(spastelero[faltaIngrediente]);
- /*Espera que el pastelero le de la señal*/
- semWait(sagente);
- }/*fin while*/
- while(fin[0]!='x'&&fin[1]!='x'&&fin[2]!='x'); /*espera
a los hijos*/
- /*Si algún pastelero no ha acabado se le avisa*/
- for(i=0;i<3;i++){
- if(fin[i]!='x')
- semSignal(spastelero[i]);
- }
- fprintf(pf,"Agente: me dispongo a cerrar todo\n");
- fflush(pf);
- if(!eliminarMemoria( )){ /*eliminar la memoria compartida*/
- fprintf(stderr,"Error al eliminar memoria\n");
- fflush(stderr);
- }
- /*cerrar semáforos y ficheros*/
- semClose(sagente);
- fclose(pf);
- for(i=0;i<3;i++)
- exit(1);
- } /*fin padre*/
- else{ /*proceso hijo,pastelero1*/
- if(0!=fork( )) /*proceso pastelero 1*/
- pastelero(pf,0,clavePastelero,claveAgente,spastelero,sagente,
- pastel,fin);
- else
- if(0!=fork( )) /*proceso hijo, pastelero2*/
- pastelero(pf,1,clavePastelero,claveAgente,spastelero,sagente,
- pastel,fin);
- else /*proceso hijo, pastelero3*/
- pastelero(pf,2,clavePastelero,claveAgente,spastelero,sagente,
- pastel,fin);
- } /*fin hijos*/
}/*fin main*/
volver al menú principal