Practicas1-4_inesminion.pdf InesMinion Informática Industrial Grado en Ingeniería Electrónica, Robótica y Mecatrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. INFORMATICA TODO LO NECESARIO INES MINION NOTA: ESTE DOCUMENTO HA SIDO CREADO PARA WUOLAH. NO COMPARTIR SIN PERMISO DEL CREADOR. GRACIAS Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. PRAC1 1. arg_simple ............................................................................................................................. 3 2. ej_arg..................................................................................................................................... 3 3. conc_arg ................................................................................................................................ 4 4. suma_arg ............................................................................................................................... 5 5. iniciador1 ............................................................................................................................... 5 6. indeciso1 ............................................................................................................................... 6 Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. Contenido 1. arg_simple /* Programa que imprime sus argumentos */ #include <stdio.h> printf("argc vale %d\n", argc); printf("Estos son mis argumentos:\n"); for(i=0; i<argc; i++) printf("%s\n", argv[i]); return 0; } 2. ej_arg /* Ejemplo de interpretacion de argumentos */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { int reves = 0; int inic = 0; int fin = 5; int i; printf("mi primer arg. es %s\n", argv[0]); for(i=1; i<argc; i++) { if(!strcmp("-r", argv[i])) reves = 1; if(!strcmp("-inic", argv[i]) && i<argc-1) { if(sscanf(argv[i+1], "%d", &inic)) { i++; } else printf("no puedo leer numero inicial\n"); } if(!strcmp("-fin", argv[i]) && i<argc-1) { if(sscanf(argv[i+1], "%d", &fin)) { Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. int main(int argc, char **argv) { int i; i++; } else printf("no puedo leer numero final\n"); } if(!reves) { for(i=inic; i<=fin; i++) printf("%d\n", i); } else { for(i=fin; i>=inic; i--) printf("%d\n", i); } return 0; } 3. conc_arg /* Programa que imprime todos los argumentos seguidos */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { int i; int tam=0; char *destino; printf("el numero de argumentos es %d\n", argc); for (i=1;i<argc;i++) { tam = tam + strlen(argv[i]); } destino = (char *)malloc(tam); for(i=1;i<argc;i++) { strcat(destino,argv[i]); } printf("Esto es lo que has escrito: %s\n", destino); free(destino); return 0; } Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. } /* Programa que suma los argumentos */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { int i , p; float suma=0, n=0; for (i=1;i<argc;i++) { p = sscanf(argv[i],"%f",&n); if (p==0) { printf ("%s No es un numero en punto flotante\n",argv[i]); } else { suma = suma +n; } } printf("%f", suma); return 0; } 5. iniciador1 /* Inicializador de la interfaz grafica */ /* Cabeceras */ #include #include #include #include #include #include <stdio.h> <stdlib.h> <time.h> <pthread.h> <signal.h> "api_grafi.h" /* Interfaz grafica */ /* Dimensiones y escala del grafico */ #define ESCALA_DIB 30 #define ALTO 10 #define ANCHO 10 int fondo[ALTO][ANCHO] = { { { { { { { { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1}, 1}, 1}, 1}, 1}, 1}, 1}, Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. 4. suma_arg { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1}, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; int main(void) { id_grafi_t pgrafi; indeciso1 = fork(); indeciso2 = fork(); indeciso3 = fork(); if (crear_grafico ==0 ) { execl ("grafi", "grafi", "migrafi", NULL); printf("Ya he creado eso\n"); } else { /* Arranque de graficos */ pgrafi = abrir_graficos("migrafi", 0); cambia_escala_id(ESCALA_DIB, pgrafi); crear_fondo_id(fondo[0], ANCHO, ALTO, pgrafi); printf("Ya he inicializado esto\n"); cerrar_graficos(pgrafi, 0); printf("main: Acabando\n"); exit(0); } } 6. indeciso1 /* Ejemplo de uso de la interfaz grafica */ /* Programa indeciso.c */ /* Cabeceras */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include "api_grafi.h" #include "funciones.h" /* Interfaz grafica */ /* Dimensiones y escala del grafico */ #define ESCALA_DIB 30 Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. pid_t crear_grafico; int main(int argc, char **argv) { id_grafi_t pgrafi; elemento_t veh; float barrido[NPUNTOS]; struct timespec ciclo = {0, 200000000L}; float vf, vc; int num; /* Arranque de graficos */ pgrafi = abrir_graficos("migrafi", 0); if(pgrafi == (id_grafi_t)NULL) exit(1); else printf("main: Tengo acceso a ventana migrafi\n"); /* Crear vehiculo */ sscanf(argv[3], "%d",&num); veh = crear_vehiculo_id(atoi(argv[1]),atoi(argv[2]), pgrafi); poner_cont (veh, num); /* Configurar laser */ configurar_laser(veh, NPUNTOS, -180., +180., 0., 100.); /* Bucle para actualizar velocidad */ while(1) { leer_laser(veh, barrido, NPUNTOS); actualizar_v(barrido, &vf, &vc); cambia_vel(veh, vf, vc); nanosleep(&ciclo, NULL); } /* Aqui no llega.... */ printf("main: Parando graficos\n"); cerrar_graficos(pgrafi, 0); printf("main: Acabando\n"); exit(0); } Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* main */ INFORMATICA TODO LO NECESARIO INES MINION NOTA: ESTE DOCUMENTO HA SIDO CREADO PARA WUOLAH. NO COMPARTIR SIN PERMISO DEL CREADOR. GRACIAS Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. PRAC2 1. iniciador1 ............................................................................................................................... 3 2. iniciador_ap3 ......................................................................................................................... 4 3. indeciso1 ............................................................................................................................... 5 Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. Contenido 1. iniciador1 /* Inicializador de la interfaz grafica */ #include #include #include #include #include #include <stdio.h> <stdlib.h> <time.h> <pthread.h> <signal.h> "api_grafi.h" /* Interfaz grafica */ /* Dimensiones y escala del grafico */ #define ESCALA_DIB 30 #define ALTO 10 #define ANCHO 10 int fondo[ALTO][ANCHO] = { { { { { { { { { { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; int main(void) { id_grafi_t pgrafi; /* Arranque de graficos */ /* Cambio */ pgrafi = abrir_graficos("migrafi", 1); /* Fin cambio */ cambia_escala_id(ESCALA_DIB, pgrafi); crear_fondo_id(fondo[0], ANCHO, ALTO, pgrafi); printf("Ya he inicializado esto\n"); cerrar_graficos(pgrafi, 0); printf("main: Acabando\n"); exit(0); } Descarga la app de Wuolah desde tu store favorita 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}, 1}, 1}, 1}, 1}, 1}, 1}, 1}, 1}, 1 } Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* Cabeceras */ 2. iniciador_ap3 /* Inicializador de la interfaz grafica */ #include #include #include #include #include #include #include <stdio.h> <stdlib.h> <time.h> <pthread.h> <signal.h> "api_grafi.h" "indeciso_h.h" /* Interfaz grafica */ /* Dimensiones y escala del grafico */ #define ESCALA_DIB 30 #define ALTO 10 #define ANCHO 10 int fondo[ALTO][ANCHO] = { { { { { { { { { { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, }; void *indeciso(void *p); int main(void) { id_grafi_t pgrafi; pthread_t Hilo[3]; int status; int i; int *p; /* Arranque de graficos */ pgrafi = abrir_graficos("migrafi", 1); cambia_escala_id(ESCALA_DIB, pgrafi); crear_fondo_id(fondo[0], ANCHO, ALTO, pgrafi); printf("Ya he inicializado esto\n"); cerrar_graficos(pgrafi, 1); printf("main: Acabando\n"); /* Arranque de indecisos*/ Descarga la app de Wuolah desde tu store favorita 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}, 1}, 1}, 1}, 1}, 1}, 1}, 1}, 1}, 1 } Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* Cabeceras */ for (i=1; i<4;i++) { p = malloc(4*sizeof(20)); struct arg_ind ind = (i,i,i,pgrafi); p = ind; pthread_create(&Hilo[i-1],NULL, indeciso,(void*)p); exit(0); } 3. indeciso1 /* Ejemplo de uso de la interfaz grafica */ /* Programa indeciso.c */ /* Cabeceras */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include "api_grafi.h" #include "funciones.h" /* Interfaz grafica */ /* Dimensiones y escala del grafico */ #define ESCALA_DIB 30 /* main */ int main(int argc, char **argv) { id_grafi_t pgrafi; elemento_t veh; float barrido[NPUNTOS]; struct timespec ciclo = {0, 200000000L}; float vf, vc; /* Cambio */ float finic, cinic; int id; finic = 2.; cinic = 2.; id = 0; /* Interpretar argumentos */ /* Se comprueba primero si el argumento existe, Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. } if(argc >= 2) if(argc >= 3) if(argc >= 4) /* Fin cambio sscanf(argv[1], "%f", &finic); sscanf(argv[2], "%f", &cinic); sscanf(argv[3], "%d", &id); */ /* Arranque de graficos */ pgrafi = abrir_graficos("migrafi", 0); if(pgrafi == (id_grafi_t)NULL) exit(1); else printf("main: Tengo acceso a ventana migrafi\n"); /* Crear vehiculo */ /* Cambio */ veh = crear_vehiculo_id(finic, cinic, pgrafi); poner_cont(veh, id); /* Fin cambio */ /* Configurar laser */ configurar_laser(veh, NPUNTOS, -180., +180., 0., 100.); /* Bucle para actualizar velocidad */ while(1) { leer_laser(veh, barrido, NPUNTOS); actualizar_v(barrido, &vf, &vc); cambia_vel(veh, vf, vc); nanosleep(&ciclo, NULL); } /* Aqui no llega.... */ printf("main: Parando graficos\n"); cerrar_graficos(pgrafi, 0); printf("main: Acabando\n"); exit(0); } Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. pero no si la conversion tiene exito */ INFORMATICA TODO LO NECESARIO INES MINION NOTA: ESTE DOCUMENTO HA SIDO CREADO PARA WUOLAH. NO COMPARTIR SIN PERMISO DEL CREADOR. GRACIAS Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. PRAC3 Contenido practica3.c ............................................................................................................................. 3 2. monitor.c ............................................................................................................................... 6 Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. 1. Descarga la app de Wuolah desde tu store favorita 1. practica3.c /* Cabeceras del sistema */ #include <unistd.h> #include <pthread.h> #include <stdio.h> #include <signal.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> /* Cabecera de graficos */ #include "api_grafi.h" /* Cabeceras de la practica */ #include "practica3.h" #include "monitor.h" /* Mapa */ #define P PARED #define C PASILLO int mapa[ALTO][ANCHO] = { {P, {P, {P, {P, {P, {P, {P, {P, {P, }; /* Definido en api_grafi.h */ " /* " P, P, P, C, C, C, C, P, P, P, P, C, C, C, C, C, P, P, P, P, C, C, C, C, C, P, P, P, P, C, P, P, P, P, P, P, P, P, C, P, P, P, P, P, P, P, P, C, P, P, P, P, P, P, P, P, C, C, C, C, C, P, P, P, P, C, C, C, C, C, C, P, P, P, P, C, C, C, C, P, P, P, P, P, C, C, C, C, P, P, " */ P}, P}, P}, P}, P}, P}, P}, P}, P}, /* Manejadores */ void mcomun(int sig, siginfo_t *info, void *p) { printf("mcomun: Entra indebidamente manejador para señal SIGRTMIN+%d\n", sig-SIGRTMIN); } /* Funcion para inicializar los graficos */ id_grafi_t inic_graficos(void); /* main */ int main(int argc, char **argv) { pthread_t tveh_desc[N_VEH_DESC]; pthread_t hcarga; struct arg_veh *parg; // control vehiculos de descarga // control vehiculos de carga // para los argumentos del control anteriores id_grafi_t idgr; siginfo_t info; sigset_t spuls; Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* Practica 3 INFI (11/2017) */ #define _POSIX_C_SOURCE 200112L int npuls; int sig; int i; /* Inicializar tratamiento de senales */ accion.sa_flags = SA_SIGINFO; sigemptyset(&accion.sa_mask); accion.sa_sigaction = mcomun; sigaction(SIG_PULS, &accion, NULL); sigemptyset(&spuls); sigaddset(&spuls, SIG_PULS); pthread_sigmask (SIG_BLOCK, &spuls, NULL); /* Crear graficos */ idgr = inic_graficos(); /* Inicializar monitor */ ini_monitor(idgr); /* Crear hilos de vehiculo */ for(i=0; i<N_VEH_DESC; i++) { printf("pr3: Creando veh. de descarga %d\n", i); parg = malloc(sizeof(struct arg_veh)); parg->fila = FILA_APARCAMIENTO + i; parg->col = COL_APARCAMIENTO; parg->id = i; parg->idgr = idgr; pthread_create(&tveh_desc[i], NULL, hilo_descarga, parg); } printf("pr3: Creando veh. de carga %d\n", i); /* solo hay uno */ parg = malloc(sizeof(struct arg_veh)); parg->fila = FILA_AP_CARGA; parg->col = COL_AP_CARGA; parg->id = i; parg->idgr = idgr; pthread_create(&hcarga, NULL, hilo_carga, parg); /* Bucle de atencion de senales de pulsadores */ printf("pr3: comenzando bucle\n"); while(1) { printf("pr3: Esperando alguna senal de pulsador\n"); sig = sigwaitinfo(&spuls, &info); npuls = info.si_value.sival_int; if(sig == SIG_PULS) { printf("pr3: Activado pulsador de almacen %d\n", npuls ); notificar_orden(npuls); } else if(sig == -1) { printf("pr3: Error en sigwaitinfo: %s\n", strerror(errno)); } else { Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. struct sigaction accion; printf("pr3: Recibida senal inesperada SIGRTMIN+%d\n", sigSIGRTMIN); } } /* Crear graficos */ /* NO ES NECESARIO MODIFICARLA */ id_grafi_t inic_graficos(void) { id_grafi_t idgr; int i; char nombre[20]; /* Crear y abrir graficos */ printf("pr3: arrancando graficos\n"); idgr = abrir_graficos("Practica 3", 1); if(idgr != GRAFI_FALLO_CREACION) printf("pr3: Graficos creados\n"); else { printf("pr3: No puede crearse la ventana grafica\n"); exit(1); } /* Cambiar escala y fondo */ cambia_escala_id(ESCALA_DIB, idgr); crear_fondo_id((int *)mapa, ANCHO, ALTO, idgr); /* Crear pulsadores */ for(i=0; i<N_ALM; i++) { sprintf(nombre, "P%d", i); crear_pulsador_codigo_id(FILA_PULS+i, COL_PULS, SIG_PULS, nombre, i, idgr); } return idgr; } Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* Tal y como esta aqui no llega */ cerrar_graficos(idgr, 1); printf("pr3: acabando\n"); return 0; } 2. monitor.c /* Cabeceras del sistema */ #include <unistd.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> /* Cabecera de la practica */ #include "practica3.h" #include "monitor.h" /* Mutex y variables de condicion */ pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t vc_orden_disp = PTHREAD_COND_INITIALIZER; pthread_cond_t vc_orden_asignada = PTHREAD_COND_INITIALIZER; vc_piezas_ok = PTHREAD_COND_INITIALIZER; pthread_cond_t /* Estructura para contener una orden para los vehiculos */ struct orden { /* Numero de almacen */ int nalm; /*0: Orden no valida, porque ya esta aceptada; int pendiente; 1: Orden pendiente de ser aceptada por algun vehiculo */ }; struct orden orden_pendiente; /* Orden para los vehiculos */ /* Estructura para las posiciones de almacenamiento */ struct almac { int contenido; /* Numero de piezas que contiene * /* 1: Almacen reservado para carga o int reservado; descarga */ /* 0: Almacen no reservado */ elemento_t id; /* Id del grafico del almacen */ }; /* Almacenes */ /* Tabla de almacenes */ struct almac tabla_alm[N_ALM]; /* Numero total de piezas en int ntot_piezas; los almacenes */ /* Minimo numero de piezas para avisar con int min_piezas; vc_piezas_ok */ /* Tabla de mutex para acceso a pasillos */ pthread_mutex_t mut_pasillo[N_PASILLOS]; /* Identificador de graficos */ id_grafi_t idgr; /* Funciones de acceso al monitor */ /* Inicializacion del monitor */ void ini_monitor(id_grafi_t id) { int i; idgr = id; for(i=0; i<N_ALM; i++) { Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* Monitor para la practica 3 de INFI (11/2017) */ #define _POSIX_C_SOURCE 200112L tabla_alm[i].contenido = 0; tabla_alm[i].reservado = 0; tabla_alm[i].id = crear_almacen_id(FILA_ALM+i, COL_ALM, idgr); poner_cont(tabla_alm[i].id, tabla_alm[i].contenido); } ntot_piezas = 0; min_piezas = MAX_PIEZAS_CARGA; } /* Notificar una orden para los vehiculos */ /* Utilizada por main cuando detecta la pulsacion de un pulsador de almacen */ /* npuls: Numero de pulsador (o de almacen) */ /* Debe esperar a que la orden anterior haya sido aceptada por un vehiculo */ /* Devuelve 1 si la orden ha sido notificada y 0 si no ha sido posible hacerlo */ int notificar_orden(int npuls) { printf("notificar_orden: Notificando peticion de pulsador %d\n", npuls); pthread_mutex_lock(&mut); while(orden_pendiente.pendiente == 1) pthread_cond_wait(&vc_orden_asignada, &mut); orden_pendiente.nalm = npuls; orden_pendiente.pendiente = 1; pthread_cond_signal(&vc_orden_disp); /* Se manda que ya esta disponible para llevar a cabo */ pthread_mutex_unlock(&mut); return 1; } /* Esperar a recibir una orden de descarga en un almacen */ /* Utilizada por el vehiculo de descarga cuando vuelve al aparcamiento */ /* nveh: Vehiculo que ha de esperar */ /* Debe devolver un numero valido de almacen en el que el vehiculo deberia descargar */ /* Si devuelve -1 el vehiculo desaparece y su hilo acaba */ /* Si devuelve cualquier otra cosa, el vehiculo se bloquea */ int esperar_orden(int nveh) { int result = -1; printf("esperar_orden: Vehiculo %d espera orden\n", nveh); pthread_mutex_lock(&mut); while(orden_pendiente.pendiente == 0) pthread_cond_wait(&vc_orden_disp,&mut); orden_pendiente.pendiente = 0; result = orden_pendiente.nalm; pthread_mutex_unlock(&mut); return result; } /* Esperar un numero minimo total de piezas en almacenes */ Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. for(i=0; i<N_PASILLOS; i++) pthread_mutex_init(&mut_pasillo[i], NULL); int esperar_piezas(i nt npiezas, int nveh) { int res = -1; printf("esperar_piezas: Vehiculo %d esperando %d piezas\n", nveh, npiezas); pthread_mutex_lock(&mut); min_piezas = npiezas; while (ntot_piezas < min_piezas) pthread_cond_wait(&vc_piezas_ok,&mut); res = ntot_piezas; pthread_mutex_unlock(&mut); return res; } /* /* /* /* /* Descargar en almacen */ Utilizada por los vehiculos de descarga */ npiezas: Numero de piezas que quieren descargarse */ nalm: Numero de almacen en el que se descarga */ nveh: Numero de vehiculo que descarga */ void descargar(int npiezas, int nalm, int nveh) { printf("descargar: Vehiculo %d descargando %d piezas en almacen %d\n",nveh, npiezas, nalm); pthread_mutex_lock(&mut); tabla_alm[nalm].contenido += npiezas; poner_cont(tabla_alm[nalm].id, tabla_alm[nalm].contenido); ntot_piezas += npiezas; if(ntot_piezas >= min_piezas) { pthread_cond_signal(&vc_piezas_ok); } pthread_mutex_unlock(&mut); } /* /* /* /* /* /* /* Cargar de almacen */ Utilizada por el vehiculo de carga */ npiezas: Numero de piezas que el vehiculo puede cargar */ nalm: Numero de almacen */ nveh: Numero de vehiculo que carga */ Devuelve el numero de piezas realmente cargadas */ (Nunca cargara mas de las que existen en el almacen) */ int cargar(int npiezas, int nalm, int nveh) { int ret = 0; printf("cargar: Vehiculo %d cargando %d piezas de almacen %d\n", nveh, npiezas, nalm); pthread_mutex_lock(&mut); if(tabla_alm[nalm].contenido < npiezas) { ret = tabla_alm[nalm].contenido; ntot_piezas -= tabla_alm[nalm].contenido; tabla_alm[nalm].contenido = 0; Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* Utilizada por el vehiculo de carga antes de recoger las piezas */ /* npiezas: Numero minimo de piezas que debe haber para salir de la espera */ /* nveh: Numero de vehiculo que espera piezas */ /* Devuelve el numero total de piezas */ /* Si devuelve -1 el vehiculo desaparece y su hilo acaba */ } else { tabla_alm[nalm].contenido -= npiezas; ntot_piezas -= npiezas; ret = npiezas; } poner_cont(tabla_alm[nalm].id, tabla_alm[nalm].contenido); pthread_mutex_unlock(&mut); return ret; /* Pedir pasillo */ /* npasillo: codigo del pasillo (APARCAMIENTO, INTERMEDIO, ALMACENES) */ void pedir_pasillo(int npasillo) { pthread_mutex_lock(&mut_pasillo[npasillo]); } /* Liberar pasillo */ /* npasillo: codigo del pasillo (APARCAMIENTO, INTERMEDIO, ALMACENES) */ void liberar_pasillo(int npasillo) { pthread_mutex_unlock(&mut_pasillo[npasillo]); } /* /* /* /* /* Reservar almacen */ Utilizada por los vehiculos para acceder al almacen */ nalm: Almacen que se desea reservar */ nveh: Numero de vehiculo que reserva */ Devuelve 1 si se ha reservado; 0 si no */ int reservar_almacen(int nalm, int nveh) { int res = 0; printf("reservar_almacen: Vehiculo %d reservando almacen %d\n", nveh, nalm); pthread_mutex_lock(&mut); if(tabla_alm[nalm].reservado == 0) { tabla_alm[nalm].reservado = 1; res = 1; } else res = 0; pthread_mutex_unlock(&mut); return res; } /* /* /* /* Liberar almacen */ Utilizada por los vehiculos cuando dejan de usar el almacen */ nalm: Almacen que se libera */ nveh: Numero de vehiculo que libera el almacen */ void liberar_almacen(int nalm, int nveh) { printf("liberar_almacen: Vehiculo %d liberando almacen%d\n", nveh, nalm); pthread_mutex_lock(&mut); if(tabla_alm[nalm].reservado == 1) { tabla_alm[nalm].reservado = 0; Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. } } pthread_mutex_unlock(&mut); } Devolver contenido de un almacen */ Utilizada por el vehiculo de carga para saber si puede cargar algo nalm: nveh: Almacen seleccionado */ Numero de vehiculo que solicita el contenido */ int devolver_cont_alm(int nalm, int nveh) { int ret; printf("devolver_cont_alm: Vehiculo %d pidiendo contenido de almacen %d\n", nveh, nalm); pthread_mutex_lock(&mut); ret = tabla_alm[nalm].contenido; pthread_mutex_unlock(&mut); return ret; } Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* /* */ /* /* INFORMATICA TODO LO NECESARIO INES MINION NOTA: ESTE DOCUMENTO HA SIDO CREADO PARA WUOLAH. NO COMPARTIR SIN PERMISO DEL CREADOR. GRACIAS Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. PRAC4 /* Practica 4 - GIERM (11/2017) */ #define _POSIX_C_SOURCE 200112L /* Cabeceras del sistema */ #include #include #include #include #include #include #include #include #include #include #include #include <unistd.h> <pthread.h> <stdio.h> <signal.h> <stdlib.h> <errno.h> <string.h> <sys/wait.h> <sys/types.h> <mqueue.h> <sys/stat.h> <fcntl.h> /* Cabeceras de la practica */ #include "practica4.h" #include "monitor.h" /* Mapa */ /* Definido en api_grafi.h */ /* " " #define P PARED #define C PASILLO int mapa[ALTO][ANCHO] = { {P, {P, {P, {P, {P, {P, {P, {P, {P, }; P, P, P, C, C, C, C, P, P, P, P, C, C, C, C, C, P, P, P, P, C, C, C, C, C, P, P, P, P, C, P, P, P, P, P, P, P, P, C, P, P, P, P, P, P, P, P, C, P, P, P, P, P, P, P, P, C, C, C, C, C, P, P, P, P, C, C, C, C, C, C, P, /* Tabla de datos de procesos de vehiculo */ struct st_veh { int indice; int finic; int cinic; int veh_descarga; pid_t id; pthread_t hilo; mqd_t cola_resp; char ncola_resp[20]; mqd_t cola_pet; char ncola_pet[20]; }; struct st_veh vehiculos[N_VEH_DESC+1]; /* Prototipos de funciones */ id_grafi_t inic_graficos(void); void crear_vehiculos(struct st_veh *pv, int n); P, P, P, C, C, C, C, P, P, P, P, P, C, C, C, C, P, P, P}, P}, P}, P}, P}, P}, P}, P}, P}, " */ Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. practica4.c void *hilo_veh(void *p); char *str_pasillo(int n); char *str_tipo_pet(int tipo); /* Manejador */ /* main */ int main(int argc, char **argv) { id_grafi_t idgr; siginfo_t info; sigset_t spuls; struct sigaction accion; int sig; int npuls; int i; /* Inicializar tratamiento de senales */ accion.sa_flags = SA_SIGINFO; sigemptyset(&accion.sa_mask); accion.sa_sigaction = mcomun; sigaction(SIG_PULS, &accion, NULL); sigemptyset(&spuls); sigaddset(&spuls, SIG_PULS); pthread_sigmask(SIG_BLOCK, &spuls, NULL); /* Crear cola de peticiones */ /* Crear vehiculos */ for(i=0; i<N_VEH_DESC; i++) { vehiculos[i].indice = i; vehiculos[i].finic = FILA_APARCAMIENTO+i; vehiculos[i].cinic = COL_APARCAMIENTO; vehiculos[i].veh_descarga = 1; } vehiculos[N_VEH_DESC].indice = N_VEH_DESC; vehiculos[N_VEH_DESC].finic = FILA_AP_CARGA; vehiculos[N_VEH_DESC].cinic = COL_AP_CARGA; vehiculos[N_VEH_DESC].veh_descarga = 0; printf("main: Voy a crear vehiculos\n"); crear_vehiculos(vehiculos, N_VEH_DESC+1); /* Crear graficos */ printf("main: Voy a inicializar graficos\n"); idgr = inic_graficos(); printf("main: Voy a inicializar monitor\n"); ini_monitor(idgr); /* Crear hilos de atencion de peticiones */ for(i=0; i<N_VEH_DESC+1; i++) pthread_create(&vehiculos[i].hilo, NULL, hilo_veh, (void *)&vehiculos[i]); Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. void mcomun(int sig, siginfo_t *info, void *p) { printf("mcomun: Entra indebidamente manejador para senal SIGRTMIN+%d\n", sig-SIGRTMIN); } printf("main: comenzando bucle\n"); while(1) { printf("main: Esperando alguna senal de pulsador\n"); sig = sigwaitinfo(&spuls, &info); npuls = info.si_value.sival_int; if(sig == SIG_PULS) { printf("main: Activado pulsador de almacen %d\n", npuls); notificar_orden(npuls); } else if(sig == -1) { printf("main: Error en sigwaitinfo: %s\n", strerror(errno)); } else { printf("main: Recibida senal inesperada SIGRTMIN+%d\n", sig-SIGRTMIN); } } /* Tal y como esta aqui no llega */ cerrar_graficos(idgr, 1); printf("main: acabando\n"); return 0; } /* Funcion para crear procesos de vehiculos */ void crear_vehiculos(struct st_veh *pv, int n) { int i; struct mq_attr atr_pet; struct mq_attr atr_resp; char arg1[20]; char arg2[20]; char arg3[20]; char arg4[20]; char arg5[20]; char *nom_ejec; atr_resp.mq_maxmsg = 2; atr_resp.mq_msgsize = sizeof(struct st_resp_veh); atr_pet.mq_maxmsg = 2; atr_pet.mq_msgsize = sizeof(struct st_peticion); for(i=0; i<n; i++) { sprintf(arg1, "%d", pv[i].indice); sprintf(arg2, "%d", pv[i].finic); sprintf(arg3, "%d", pv[i].cinic); sprintf(arg4, "/cpet%d", i); mq_unlink(arg4); pv[i].cola_pet = mq_open(arg4, O_CREAT | O_RDONLY, S_IRWXU, &atr_pet); if(pv[i].cola_pet == -1) printf("crear_vehiculos: Error %s al abrir cola %s\n", strerror(errno), arg4); strcpy(pv[i].ncola_pet, arg4); sprintf(arg5, "/cresp%d", i); mq_unlink(arg5); pv[i].cola_resp = mq_open(arg5, O_CREAT | O_WRONLY , S_IRWXU, &atr_resp); if(pv[i].cola_resp == -1) printf("crear_vehiculos: Error %s al abrir cola %s\n", strerror(errno), arg5); strcpy(pv[i].ncola_resp, arg5); if(pv[i].veh_descarga) nom_ejec = "./veh_desc"; Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. /* Bucle de atencion de senales de pulsadores */ pv[i].id = fork(); if(pv[i].id == 0) { execl(nom_ejec, nom_ejec, arg1, arg2, arg3, arg4, arg5, NULL); printf("crear_vehiculos: No puedo arrancar vehiculo %d\n", i); exit(1); } else if(pv[i].id == -1) printf("crear_vehiculos: Error %s en fork\n", strerror(errno)); else printf("crear_vehiculos: Creado proceso de vehiculo %d\n", i); } } /* Hilo para atender peticiones de vehiculo */ void *hilo_veh(void *p) { struct st_veh *miveh = p; struct st_peticion peticion; int pri; while(1) { struct st_resp_veh respuesta = {-1, 0, 0, 0}; int npuls = -1; int npiezas = 0; int reserva = 0; int res = -1; printf("hilo_veh-%d: Esperando peticion\n", miveh->indice); res = mq_receive(miveh->cola_pet, (char *)&peticion, sizeof(peticion), &pri); if(res == -1) printf("hilo_veh %d: Error en mq_receive %s\n", miveh>indice, strerror(errno)); else { printf("hilo_veh-%d: Recibida peticion de tipo %d (%s)\n", miveh->indice, peticion.tipo, str_tipo_pet(peticion.tipo)); switch(peticion.tipo) { case PET_ESPERAR_ORDEN: printf("hilo_veh-%d: Recibida peticion de esperar orden por veh. %d\n", miveh->indice, peticion.nveh); npuls respuesta.tipo = peticion.tipo; = esperar_orden(peticion.nveh); respuesta.npuls = npuls; res = mq_send(miveh->cola_resp, (char *)&respuesta, sizeof(respuesta), 0); if(res!=-1) printf("hilo_veh-%d: Enviada orden a vehiculo %d\n", miveh->indice, miveh->indice); else printf("hilo_veh-%d: error %s en mq_send\n", miveh>indice, strerror(errno)); break; PET_ESPERAR_PIEZAS: printf("hilo_veh-%d: Recibida peticion de esperar al menos %d piezas por veh. %d\n", miveh->indice, peticion.npiezas, peticion.nveh); npiezas = esperar_piezas(peticion.npiezas, peticion.nveh); respuesta.tipo = peticion.tipo; respuesta.npiezas = npiezas; res = mq_send(miveh->cola_resp, (char *)&respuesta, sizeof(respuesta), 0); if(res != -1) printf("hilo_veh-%d: esperando %d piezas \n", miveh->indice, npiezas); else printf("hilo_veh-%d: error %s en mq_send\n", miveh>indice, strerror(errno)); break; case Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. nom_ejec = "./veh_carga"; else break; case PET_DESCARGAR: printf("hilo_veh-%d: Recibida peticion de descargar %d piezas en posicion %d por veh. %d\n", miveh->indice, peticion.npiezas, peticion.nalm, peticion.nveh); descargar(peticion.npiezas, peticion.nalm, peticion.nveh); printf("hilo_veh-%d: Descargadas %d piezas en posicion %d\n", miveh->indice, peticion.npiezas,peticion.nalm); break; case PET_PEDIR_PASILLO: printf("hilo_veh-%d: Recibida peticion del veh. %d de pedir pasillo %d (%s)\n", miveh->indice, peticion.nveh, peticion.npasillo, str_pasillo(peticion.npasillo)); pedir_pasillo(peticion.npasillo); respuesta.tipo = peticion.tipo; res = mq_send(miveh->cola_resp, (char *)&respuesta, sizeof(respuesta), 0); if(res != -1) printf("hilo_veh-%d: Enviada concesion de pasillo %d (%s) a veh. %d\n", miveh->indice, peticion.npasillo,str_pasillo (peticion.npasillo), peticion.nveh); else printf("hilo_veh-%d: error %s en mq_send\n", miveh>indice, strerror(errno)); break; case PET_LIB_PASILLO: printf("hilo_veh-%d: Recibida peticion del veh. %d de liberar pasillo %d (%s)\n", miveh->indice, peticion.nveh, peticion.npasillo, str_pasillo(peticion.npasillo)); liberar_pasillo(peticion.npasillo); break; case PET_RES_ALMACEN: printf("hilo_veh-%d: Recibida peticion del veh. %d de reservar almacen %d\n",miveh->indice, peticion.nveh, peticion.nalm); reserva = reservar_almacen(peticion.nalm, peticion.nveh); respuesta.tipo = peticion.tipo; respuesta.reservado = reserva; res = mq_send(miveh->cola_resp, (char *)&respuesta, sizeof(respuesta), 0); if(res != -1) { if(reserva == 1) printf("hilo_veh-%d: Enviado mensaje de reserva de %d a veh. %d\n",miveh->indice, peticion.nalm, peticion.nveh); else printf("hilo_veh-%d: Enviado mensaje de NO reserva de %d a veh. %d\n", miveh->indice, peticion.nalm, peticion.nveh); } Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. case PET_CARGAR: printf("hilo_veh-%d: Recibida peticion de cargar %d piezas de posicion %d por veh. %d\n",miveh->indice, peticion.npiezas, peticion.nalm, peticion.nveh); npiezas = cargar(peticion.npiezas, peticion.nalm, peticion.nveh); respuesta.tipo = peticion.tipo; respuesta.npiezas = npiezas; res = mq_send(miveh->cola_resp, (char *)&respuesta, sizeof(respuesta), 0); if(res != -1) printf("hilo_veh-%d: Cargadas %d piezas de posicion %d modificada\n",miveh->indice, npiezas, peticion.nalm); else printf("hilo_veh-%d: error %s en mq_send\n", miveh>indice, strerror(errno)); else printf("hilo_veh-%d: error %s en mq_send\n", miveh>indice, strerror(errno)); break; case PET_LIB_ALMACEN: printf("hilo_veh-%d: Recibida peticion del veh. %d de liberar almacen %d\n",miveh->indice, peticion.nveh, peticion.nalm); liberar_almacen(peticion.nalm,peticion.nveh); case PET_CONT_ALMACEN: printf("hilo_veh-%d: Recibida peticion del veh. %d de contenido de almacen %d\n",miveh->indice, peticion.nveh, peticion.nalm); npiezas = devolver_cont_alm(peticion.nalm,peticion.nveh); respuesta.tipo = peticion.tipo; respuesta.npiezas = npiezas; res = mq_send(miveh->cola_resp, (char *)&respuesta, sizeof(respuesta), 0); if(res != -1) printf("hilo_veh-%d: Enviada respuesta a veh. %d\n",miveh->indice, peticion.nveh); else printf("hilo_veh-%d: error %s en mq_send\n", miveh>indice, strerror(errno)); break; default: printf("hilo_veh-%d: Peticion %d desconocida\n", miveh->indice, peticion.tipo); } } } return NULL; } /* Devolver nombre de pasillo */ char *str_pasillo(int n) { char *nombres[] = { "APARCAMIENTO", "INTERMEDIO", "ALMACENES" }; if(n < APARCAMIENTO || n > ALMACENES) return "<no valido>"; else return nombres[n]; } /* Devolver nombre de tipo de peticion */ char *str_tipo_pet(int tipo) { char *nombres[] = { "PET_ESPERAR_ORDEN", "PET_ESPERAR_PIEZAS", "PET_CARGAR", "PET_DESCARGAR", "PET_PEDIR_PASILLO", "PET_LIB_PASILLO", "PET_RES_ALMACEN", "PET_LIB_ALMACEN", "PET_CONT_ALMACEN" }; Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. break; if(tipo < PET_ESPERAR_ORDEN || tipo > PET_CONT_ALMACEN) return "<no valido>"; else return nombres[tipo]; } /* Crear graficos */ /* NO ES NECESARIO MODIFICARLA */ id_grafi_t idgr; int i; char nombre[20]; /* Crear y abrir graficos */ printf("inic_graficos: arrancando graficos\n"); idgr = abrir_graficos("Practica 4", 1); if(idgr != GRAFI_FALLO_CREACION) printf("inic_graficos: Graficos creados\n"); else { printf("inic_graficos: No puede crearse la ventana grafica\n"); exit(1); } /* Cambiar escala y fondo */ cambia_escala_id(ESCALA_DIB, idgr); crear_fondo_id((int *)mapa, ANCHO, ALTO, idgr); /* Crear pulsadores */ for(i=0; i<N_ALM; i++) { sprintf(nombre, "P%d", i); crear_pulsador_codigo_id(FILA_PULS+i, COL_PULS, SIG_PULS, nombre, i, idgr); } return idgr; } Descarga la app de Wuolah desde tu store favorita Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad. id_grafi_t inic_graficos(void) {