Está en la página 1de 11

MAKEFILE all: servidor_ncurses canalpanama barcoeste barcooeste servidor_ncurses: servidor_ncurses.c definiciones.h comun.h cc servidor_ncurses.c -o servidor_ncurses -lncurses canalpanama: canalpanama.

c cc canalpanama.c -o canalpanama barcoeste: barcoeste.c comun.h comunbarcos.c comunbarcos.h cc barcoeste.c comunbarcos.c -o barcoeste barcooeste: barcooeste.c comun.h comunbarcos.c comunbarcos.h cc barcooeste.c comunbarcos.c -o barcooeste CANALPANAMA.C #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> struct Parametros { int tesclusa; int lagomin; int lagomax; int mevoymin; int mevoymax; };

// Tiempo de estancia //Intervalo de tiempo //Intervalo de tiempo //Intervalo de tiempo //Intervalo de tiempo

en en en en en

la esclusa cruzar el lago MIN cruzar el lago MAX esperar para irse MIN esperar para irse MAX

int creaproceso(const char *, const char *); int creaprocesotub(const char nombre[],int tub[],int canal); void leeparametros(struct Parametros *param,int *maxbarcos,int *creamin,int *creamax, int *caplago); void R10(); void R12(); int llega10=0; main() { int pservidorgraf, i; int tubo[2]; struct Parametros param; int maxbarcos,creamin,creamax, caplago; int fesclusao, fesclusae, flago, testigo=1; signal(10,R10); signal(12,R12); srand(getpid()); leeparametros(&param,&maxbarcos,&creamin,&creamax,&caplago);

pservidorgraf=creaproceso("servidor_ncurses",NULL); //parametro 1 es proceso y parametro 2 fichero de redireccion if(!llega10) pause(); //Espero a que el servidor grafico de el OK //creamos pipes y fifos pipe(tubo); mkfifo("esclusae",0600); mkfifo("esclusao",0600); mkfifo("lago",0600); // abrimos fifos para escribir testigos fesclusae=open("esclusae",O_RDWR); fesclusao=open("esclusao",O_RDWR); flago=open("lago",O_RDWR); // escribimos los testigos write(fesclusae,&testigo,sizeof(testigo)); write(fesclusao,&testigo,sizeof(testigo)); for(i=0;i<caplago;i++) write(flago,&testigo,sizeof(testigo)); // creamos los barcos pasandoles los parametros for(i=1;i<=maxbarcos;i++) { if(rand()%2==0) { creaprocesotub("barcoeste",tubo,2); write(tubo[1],&param,sizeof(param)); } else { creaprocesotub("barcooeste",tubo,2); write(tubo[1],&param,sizeof(param)); } sleep((rand()%(creamax-creamin+1))+creamin); } //esperamos que terminen todos los barcos for(i=1;i<=maxbarcos;i++) wait(NULL); sleep(1); kill(pservidorgraf,10); close(fesclusae); close(fesclusao); close(flago); unlink("esclusae"); unlink("esclusao"); unlink("lago"); system("reset"); } /************* FUNCIONES *********************************/ int creaprocesotub(const char nombre[],int tub[],int canal) { int vpid; vpid=fork(); if(vpid==0) { close(canal); dup(tub[0]); execl(nombre,nombre,NULL);

perror("error de execl"); exit(-1); } else if (vpid==-1) { perror("error de fork"); exit(-1); } return vpid; } int creaproceso(const char nombre[],const char redire[]) { int vpid; vpid=fork(); if(vpid==0) { if(redire!=NULL) { close(1); open(redire,O_WRONLY|O_CREAT,0600); } execl(nombre,nombre,NULL); perror("error de execl"); exit(-1); } else if (vpid==-1) { perror("error de fork"); exit(-1); } return vpid; } void leeparametros(struct Parametros *param,int *maxbarcos,int *creamin,int *creamax, int *caplago) { int ok=9; *maxbarcos=20; //Nmero de barcos que se crearan *creamin=1; //Intervalo de tiempo para crear nuevos barcos MIN *creamax=5; //Intervalo de tiempo para crear nuevos barcos MAX *caplago=6; //Capacidad del lago param->tesclusa=5; // Tiempo de estancia en la esclusa param->lagomin=10; //Intervalo de tiempo en cruzar el lago MIN param->lagomax=20; //Intervalo de tiempo en cruzar el lago MAX param->mevoymin=5; //Intervalo de tiempo en esperar para irse MIN param->mevoymax=10; //Intervalo de tiempo en esperar para irse MAX while(ok == 9) { system("clear"); printf("Valores de los parmetros...\n\n"); printf("Numero de barcos que se crearan: %d\n",*maxbarcos);

printf("Intervalo de tiempo para crear nuevos barcos: [%d-%d] \n",*creamin,*creamax); printf("Tiempo de estancia en la esclusa: %d\n",param->tesclusa); printf("Capacidad del lago: %d\n",*caplago); printf("Intervalo de tiempo en cruzar el lago: [%d-%d]\n",param->lagomin,param->lagomax); printf("Intervalo de tiempo en esperar para irse: [%d-%d]\n",param->mevoymin,param->mevoymax); printf("Pulse 9 si desea introducir nuevos valores, cualquier otro valor si desea continuar.\n"); scanf("%d",&ok); if(ok == 9){ do{ printf("Numero de barcos que se crearan [maximo 50]:\n"); scanf("%d",maxbarcos); }while(*maxbarcos <= 0 || *maxbarcos > 50); do{ printf("Intervalo de tiempo para crear nuevos barcos MIN [entre 1 y 10]: \n"); scanf("%d",creamin); }while(*creamin< 1 ||*creamin > 10 ); do{ printf("Intervalo de tiempo para crear nuevos barcos MAX [entre 5 y 20]: \n"); scanf("%d",creamax); }while(*creamax < 5 || *creamax > 20 || *creamax<=*creamin); do{ printf("Tiempo de estancia en la esclusa [maximo 20]: \n"); scanf("%d",&param->tesclusa); }while(param->tesclusa <= 0 || param->tesclusa > 20); do{ printf("Capacidad del lago [maximo 8]: \n"); scanf("%d",caplago); }while(*caplago <= 1 || *caplago > 8); do{ printf("Intervalo de tiempo en cruzar el lago MIN [entre 1 y 10]: \n"); scanf("%d",&param->lagomin); }while(param->lagomin< 1 ||param->lagomin > 10 ); do{ printf("Intervalo de tiempo en cruzar el lago MAX [entre 5 y 20]: \n"); scanf("%d",&param->lagomax); }while(param->lagomax < 5 || param->lagomax > 20 || param->lagomax <= param->lagomin ); do{

printf("Intervalo de tiempo en esperar para irse MIN [entre 1 y 10]:\n"); scanf("%d",&param->mevoymin); }while(param->mevoymin< 1 ||param->mevoymin > 10 ); do{ printf("Intervalo de tiempo en esperar para irse MAX [entre 5 y 20]:\n"); scanf("%d",&param->mevoymax); }while(param->mevoymax < 5 || param->mevoymax > 20 || param->mevoymax <= param->mevoymin); } } } void R10() { llega10=1; } void R12() { printf("No es posible arrancar el servidor grfico\n"); exit(-1); }

COMUNBARCOS.C #include <stdio.h> #include <stdlib.h> #include "comun.h" #include "comunbarcos.h" int llega10=0; /*********** FUNCION: visualiza ******************************/ /*********** Pinta o borra en el servidor grfico ************/ void visualiza(int cola, int donde, int que, int como) { struct tipo_elemento peticion; peticion.tipo=1; //da igual cual poner, no usamos tipos peticion.pid=getpid(); peticion.donde=donde; peticion.que=que; peticion.cualidad=como; msgsnd (cola, (struct tipo_elemento *) &peticion,sizeof(struct tipo_elemento)-sizeof(long),0); if(!llega10 && que==PINTAR) { pause(); //espero conformidad de que me han pintado, sino me mataran llega10=0; } } /*********** FUNCION: crea_cola ************************************/ /*** Obtiene acceso a la cola de mensajes con el id que se pasa ***/ int crea_cola(key_t clave) { int identificador; if(clave == (key_t) -1) { printf("Error al obtener clave para cola mensajes\n"); exit(-1); } identificador = msgget(clave, 0600 | IPC_CREAT); if (identificador == -1) { printf("Error al obtener identificador para cola mensajes\n"); perror("msgget"); exit (-1); } return identificador; }

void R10() { llega10=1; } void R12() // indica que no se puede pintar y muere { printf("CLIENTE %d: No puedo pintarme, porque no hay sitio en la ventana\n",getpid()); exit(-1); } COMUNBARCOS.H #include <sys/types.h> #include <sys/ipc.h> int crea_cola(key_t clave); void visualiza(int cola, int donde, int que, int como); void R10(); void R12(); struct Parametros{ int tesclusa; // Tiempo de estancia int lagomin; //Intervalo de tiempo int lagomax; //Intervalo de tiempo int mevoymin; //Intervalo de tiempo int mevoymax; //Intervalo de tiempo }; en en en en en la esclusa cruzar el lago MIN cruzar el lago MAX esperar para irse MIN esperar para irse MAX

BARCOESTE.C #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/msg.h> #include <errno.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "comun.h" #include "comunbarcos.h" int colagrafica; int fesclusao, fesclusae, flago; void R14() { visualiza(colagrafica, VESTEIN, BORRAR, TIPOESTE); visualiza(colagrafica, VHORNOS, PINTAR, TIPOESTE); close(fesclusae); close(fesclusao); close(flago); exit(0); } main() { int lapipe; struct Parametros param; int testigo=1; srand(getpid()); signal(10,R10); // me preparo para la senyal 10 signal(12,R12); // me preparo para la senyal 12 signal(14,R14); // Creamos y abrimos la cola de mensajes colagrafica=crea_cola(ftok ("./fichcola.txt", 18)); // Abrimos las fifos fesclusae=open("esclusae",O_RDWR); fesclusao=open("esclusao",O_RDWR); flago=open("lago",O_RDWR); // Leemos de la pipe los parmetros read(2,&param,sizeof(param)); //recuperamos la salida de errores lapipe=dup(2); close(2); open("/dev/tty",O_RDWR); visualiza(colagrafica, VESTEIN, PINTAR, TIPOESTE); // programo la alarma para aburrirme alarm(rand()%(param.mevoymax-param.mevoymin+1)+param.mevoymin); // reservo sitio en el lago read(flago,&testigo,sizeof(testigo)); // desactivo la alarma alarm(0);

// reservo la esclusa este read(fesclusae,&testigo,sizeof(testigo)); //entro en la esclusa visualiza(colagrafica, VESTEIN, BORRAR, TIPOESTE); visualiza(colagrafica, VESCLUSAESTE, PINTAR, TIPOESTE); sleep(param.tesclusa); //salgo y voy al lago visualiza(colagrafica, VESCLUSAESTE, BORRAR, TIPOESTE); visualiza(colagrafica, VLAGOE, PINTAR, TIPOESTE); write(fesclusae,&testigo,sizeof(testigo)); sleep(rand()%(param.lagomax-param.lagomin+1)+param.lagomin); // reservo la esclusa oeste read(fesclusao,&testigo,sizeof(testigo)); // salgo del lago y voy a la esclusa visualiza(colagrafica, VLAGOE, BORRAR, TIPOESTE); visualiza(colagrafica, VESCLUSAOESTE, PINTAR, TIPOESTE); write(flago,&testigo,sizeof(testigo)); sleep(param.tesclusa); //salgo de la esclusa y me marcho visualiza(colagrafica, VESCLUSAOESTE, BORRAR, TIPOESTE); visualiza(colagrafica, VOESTEOUT, PINTAR, TIPOESTE); write(fesclusao,&testigo,sizeof(testigo)); close(fesclusae); close(fesclusao); close(flago); }

BARCOOESTE.C #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/msg.h> #include <errno.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "comun.h" #include "comunbarcos.h" int colagrafica; int fesclusao, fesclusae, flago; void R14(){ visualiza(colagrafica, VOESTEIN, BORRAR, TIPOOESTE); visualiza(colagrafica, VHORNOS, PINTAR, TIPOOESTE); close(fesclusae); close(fesclusao); close(flago); exit(0); } main() { int lapipe; struct Parametros param; int testigo=1; srand(getpid()); signal(10,R10); // me preparo para la senyal 10 signal(12,R12); // me preparo para la senyal 12 signal(14,R14); // Creamos y abrimos la cola de mensajes colagrafica=crea_cola(ftok ("./fichcola.txt", 18)); // Abrimos las fifos fesclusae=open("esclusae",O_RDWR); fesclusao=open("esclusao",O_RDWR); flago=open("lago",O_RDWR); // Leemos de la pipe los parmetros read(2,&param,sizeof(param)); //recuperamos la salida de errores lapipe=dup(2); close(2); open("/dev/tty",O_RDWR); visualiza(colagrafica, VOESTEIN, PINTAR, TIPOOESTE); //programo la alarma alarm(rand()%(param.mevoymax-param.mevoymin+1)+param.mevoymin); // reservo sitio en el lago read(flago,&testigo,sizeof(testigo)); //desactivo la alarma

alarm(0); // reservo la esclusa este read(fesclusao,&testigo,sizeof(testigo)); //entro en la esclusa visualiza(colagrafica, VOESTEIN, BORRAR, TIPOOESTE); visualiza(colagrafica, VESCLUSAOESTE, PINTAR, TIPOOESTE); sleep(param.tesclusa); //salgo y voy al lago visualiza(colagrafica, VESCLUSAOESTE, BORRAR, TIPOOESTE); visualiza(colagrafica, VLAGOO, PINTAR, TIPOOESTE); write(fesclusao,&testigo,sizeof(testigo)); sleep((rand()%(param.lagomax-param.lagomin+1))+param.lagomin); // reservo la esclusa oeste read(fesclusae,&testigo,sizeof(testigo)); // salgo del lago y voy a la esclusa visualiza(colagrafica, VLAGOO, BORRAR, TIPOOESTE); visualiza(colagrafica, VESCLUSAESTE, PINTAR, TIPOOESTE); write(flago,&testigo,sizeof(testigo)); sleep(param.tesclusa); //salgo de la esclusa y me marcho visualiza(colagrafica, VESCLUSAESTE, BORRAR, TIPOOESTE); visualiza(colagrafica, VESTEOUT, PINTAR, TIPOOESTE); write(fesclusae,&testigo,sizeof(testigo)); close(fesclusae); close(fesclusao); close(flago); }

También podría gustarte