void Lanzador::lanzarCalesita() { //Memoria compartida para la calesita MemoriaCompartida<int> continua; int res = continua.crear(ARCH_SEM, MEM_CONTINUA, PERMISOS_USER_RDWR); if (controlErrores1(res, logger, info) == MUERTE_POR_ERROR) {raise(SIGINT);} continua.escribir(0); string arg1 = toString(auxLugares); string arg2 = toString(lugaresCalesita); string arg3 = toString(tiempoVuelta); pidCal = fork(); if (pidCal == -1){ logger->log("Error: Falla en fork de la calesita. Strerr: " + toString(strerror(errno)), info); raise (SIGINT); } if (pidCal == 0) { res = execl("Calesita", "Calesita", arg1.c_str(), arg2.c_str(), arg3.c_str(), (char*) 0); if (res != RES_OK){ logger->log("Error: Falla en exec de la calesita. Strerr: " + toString(strerror(errno)), info); raise (SIGINT); } } logger->log("Se lanzó la calesita", info); //libero para que ya la maneje solo la calesita (y mas tarde el fantasma) res = continua.liberar(); if (controlErrores1(res, logger, info) == MUERTE_POR_ERROR) {raise(SIGINT);} }
void Lanzador::lanzarFilasYNinios() { Pipe pipeEntrePuertas; // entre la fila de boletos y la de la calesita int res = pipeEntrePuertas.crear(); if (controlErrores1(res, logger, info) == MUERTE_POR_ERROR) {raise(SIGINT);} int fdRdPuerta2 = pipeEntrePuertas.getFdLectura(); // puerta de la calesita int fdWrPuerta2 = pipeEntrePuertas.getFdEscritura(); //para escribirle a la puerta 2 pidPuerta2 = fork(); if (pidPuerta2 == -1) { logger->log("Error: Falla en fork de la fila de la calesita. Strerr: " + toString(strerror(errno)), info); raise(SIGINT); } if (pidPuerta2 == 0) { res = execl("FilaCalesita", "Puerta2", toString(fdRdPuerta2).c_str(), toString(fdWrPuerta2).c_str(), (char*) 0); if (res != RES_OK) { logger->log("Error: Falla en exec de la fila de la calesita. Strerr: " + toString(strerror(errno)), info); raise(SIGINT); } } logger->log("Se lanzó la fila para subir a la calesita", info); //pipe para que los ninios se encolen para boleto pipeAKids = new Pipe(); res = pipeAKids->crear(); if (controlErrores1(res, logger, info) == MUERTE_POR_ERROR) {raise(SIGINT);} int fdRdPuerta1 = pipeAKids->getFdLectura(); fdWrPuerta1 = pipeAKids->getFdEscritura(); //para escribirle a la puerta 1 pidPuerta1 = fork(); if (pidPuerta1 == -1) { logger->log("Error: Falla en fork de la fila de boletos. Strerr: " + toString(strerror(errno)), info); raise(SIGINT); } if (pidPuerta1 == 0) { res = execl("FilaBoleto", "Fila1", toString(fdRdPuerta1).c_str(), toString(fdWrPuerta1).c_str(), toString(fdRdPuerta2).c_str(), toString(fdWrPuerta2).c_str(), (char*) 0); if (res != RES_OK) { logger->log("Error: Falla en exec de la fila de boletos. Strerr: " + toString(strerror(errno)), info); raise(SIGINT); } } logger->log("Se lanzó la fila para comprar boleto", info); pipeEntrePuertas.cerrar(); MemoriaCompartida<int> kidsInPark; res = kidsInPark.crear(ARCH_SEM, MEM_KIDS, PERMISOS_USER_RDWR); if (controlErrores1(res, logger, info) == MUERTE_POR_ERROR) {raise(SIGINT);} //Memoria compartida de cantidad de chicos en parque kidsInPark.escribir(0); //Memoria compartida para cada lugar VectorMemoCompartida<bool> lugares; res = lugares.crear(ARCH_SEM,INICIO_CLAVES_LUGARES,PERMISOS_USER_RDWR,this->lugaresCalesita); if ( controlErrores1(res, logger, info) == MUERTE_POR_ERROR ) { raise (SIGINT);} //lanza niños for (int i = 0; i < cantNinios; i++) { pid_t pid = fork(); if (pid == -1){ logger->log("Error: Falla en fork de un niño. Strerr: " + toString(strerror(errno)), info); raise (SIGINT); } if (pid == 0) { res = execl("Kid", "Kid", toString(fdRdPuerta1).c_str(), toString(fdWrPuerta1).c_str(), toString(lugaresCalesita).c_str(), (char*) 0); if (res != RES_OK){ logger->log("Error: Falla en exec de un niño. Strerr: " + toString(strerror(errno)), info); raise (SIGINT); } } logger->log("Se lanzó un niño", info); sleep((int) exponentialTime(mediaKid)); } //se desattachea de estas shared mem. despues de crear los hijos, asi siempre hay alguien usandola. if ( controlErrores1(res, logger, info) == MUERTE_POR_ERROR ) { raise (SIGINT);} res = kidsInPark.liberar(); res = lugares.liberar(); if ( controlErrores1(res, logger, info) == MUERTE_POR_ERROR ) { raise (SIGINT);} }