virtual void fecharPista (int idPista)
	{
		_mLanes->Wait();
		if(_pdLanes[idPista]==Plane::LAND)
			_pdLanes[idPista]=Plane::LAND_CLOSED;
		else
			_pdLanes[idPista]=Plane::LIFT_CLOSED;
		_mLanes->Signal();
	}
int Listasemaforos::get_congestion(int i)
{
	Semaforo *aux;
	
	aux=busca_SemaforoNumero1(i);
	
	if(aux!=NULL) return aux->congestion();
	else return -1;
	
}
	virtual void abrirPista (int idPista)
	{
		_mLanes->Wait();
		if(_pdLanes[idPista]==Plane::LAND_CLOSED)
			_pdLanes[idPista]=Plane::LAND;
		else
			_pdLanes[idPista]=Plane::LIFTOFF;

		SignalRespectiveWaitingList(_pdLanes[idPista]);
		_mLanes->Signal();
	}
	virtual void libertarPista(Plane * p)
	{
		if(!p->_finishedWork)
			return;
		_mLanes->Wait();
		_bLanes[p->_idLane]=true;
		Plane::PlaneDirection pd = _pdLanes[p->_idLane];
		_mLanes->Signal();

		SignalRespectiveWaitingList(pd);
	}
	virtual bool SetLanePriorityTo (Plane::PlaneDirection direction, int idLane)
	{
		_mLanes->Wait();
		if (!_bLanes[idLane])
		{
			_mLanes->Signal();
			return false;
		}
		_pdLanes[idLane] = direction;
		_mLanes->Signal();
		return true;
	}
	void SignalRespectiveWaitingList(Plane::PlaneDirection pd)
	{
		if(pd==Plane::LAND && _planeListToLand->next != _planeListToLand 
			|| pd==Plane::LIFTOFF && _planeListToLift->next == _planeListToLift)
		{
			_sWaitingListLanding->Signal();
		}
		else if(pd==Plane::LIFTOFF && _planeListToLift->next != _planeListToLift 
			|| pd==Plane::LAND && _planeListToLand->next == _planeListToLand)
		{
			_sWaitingListLiftoff->Signal();
		}
	}
/**
 * THREAD -> Controla el tiempo que debe durar el torneo
 */
void* temporizadorTorneo(void* data) {
	struct thTemporizador_data *torneo;
	torneo = (struct thTemporizador_data *) data;

	sem_inicializarTemporizador.P();
	cout << "Comienza el temporizador" << endl;

	cout << "mutex comenzoConteo temporizadorTorneo" << endl;
	pthread_mutex_lock(&mutex_comenzoConteo);
	comenzoConteo = true;
	pthread_mutex_unlock(&mutex_comenzoConteo);
	cout << "unmutex comenzoConteo temporizadorTorneo" << endl;

	cout << "MMMMMMMMMMMMMMMMMMMMMMMM  empieza a contar" << endl;
	sleep(torneo->duracion * 20);
	cout << "MMMMMMMMMMMMMMMMMMMMMMMM  termina de contar" << endl;

	cout << "mutex_timeIsUp temporizadorTorneo --" << endl;
	pthread_mutex_lock(&mutex_timeIsUp);
	timeIsUp = true;
	cout << "TIMEISUP =" << timeIsUp << endl;
	pthread_mutex_unlock(&mutex_timeIsUp);
	cout << "unmutex_timeIsUp temporizadorTorneo --" << endl;

	//sem_inicializarTemporizador.close();
	//pthread_cancel(torneo->thEstablecerPartidas);
	pthread_cancel(torneo->thAceptarJugadores);
	cout << "HACE LOS DOS CANCEL THREAD" << endl;
	pthread_exit(NULL);
}
	void trabajar() {
		bool seguir = true;

		while (seguir){
			int pidKid, res;
			pipeEntrePuertas->leer(&pidKid, sizeof(int));


			if (pidKid != -1) {
				string ruta = PREFIJO_FIFO_FILA_KIDS + toString(pidKid);

				//le dice al chico que pase. No hay problema con usar el mismo fifo en ambas filas.
				//para que no deje pasar a mas de los que pueden subir "considera" cuantos quiere la calesita
				res = semColaCal->p(-1);
				if ( controlErrores1(res, logger, info) == MUERTE_POR_ERROR) { kill(ppid,SIGINT);}

				FifoEscritura fifoAKid(ruta + SUFIJO_FIFO_FILA_KIDS);
				res = fifoAKid.abrir();
				if ( controlErrores2(res, logger, info) == MUERTE_POR_ERROR) { kill(ppid,SIGINT);}

				logger->log("Pasa el chico: " + toString(pidKid),info);

				fifoAKid.escribir( &VALOR_PASAR2, sizeof(int) );

				fifoAKid.cerrar();
				fifoAKid.eliminar();
			}else{
				seguir = false;
			}
		}
	}
	//As threads são desbloqueadas através de um método que indicará 
	//qual a pista a libertar e consoante a sua prioridade irá libertar
	//uma thread da lista correspondente ou uma de outra, caso não haja.
	virtual Plane * UseLaneTo(Plane::PlaneDirection direction, Plane * planeList, Semaforo * mPlaneList, Semaforo * sWaitingList)
	{
		mPlaneList->Wait();
		Plane * p = AddNewPlaneInEndOf(planeList,direction);
		p->_finishedWork = false;
		mPlaneList->Signal();
		do{
			_mLanes->Wait();
			int nLane = findLaneTo(direction);
			if(nLane == -1)
			{
				if(direction==Plane::LAND && _planeListToLift->next==_planeListToLift)
				{
					nLane = findLaneTo(Plane::LIFTOFF);
				}
				else if(direction==Plane::LIFTOFF && _planeListToLand->next==_planeListToLand)
				{
					nLane = findLaneTo(Plane::LAND);
				}
				
				if(nLane==-1)
				{
					_mLanes->Signal();
					sWaitingList->Wait();
				}
			}

			if(nLane!=-1)
			{
				_bLanes[nLane]=false;
				_mLanes->Signal();
				//obter o aviao consoante a direccao
				mPlaneList->Wait();
				p = planeList->next;
				Remove(p);
				mPlaneList->Signal();

				p->_finishedWork = true;
				p->_idLane = nLane;
				break;
			}
		}while(true);
		
		return p;
	}
void Listasemaforos::ubicarMiAuto(Vehiculo *v)
{ 	
	Nodosemaforo *nodo = czo;
    Semaforo *aux = NULL;
    
    while(nodo != NULL)
    {
        if(nodo->get_dato()->get_ubicacion() == v->get_origen()){
			aux = nodo->get_dato();
			//continue;
		}
        nodo = nodo->get_next();
    }
	if(aux != NULL) {
		if(!aux->rojo(v)) cout<<"El semaforo estaba colmado. No se pudo insertar el vehiculo mat.: "<<v->get_matricula()<<endl;		
	}
	else cout<<"Error en la busqueda del semaforo (UbicarMiAuto) "<<endl;

}
void Listasemaforos::ubicarAleatorio(Vehiculo *v)
{ 
	
	int rnd = rand()%cantSemaforos;
	Semaforo *aux;
	aux=busca_SemaforoNumero1(rnd);
	
	while(aux->get_ubicacion() == v->get_destino()){ //
		rnd= rand()%cantSemaforos;
		aux=busca_SemaforoNumero1(rnd);
	}
	
	if(aux != NULL) {
		if(aux->rojo(v)) { //Si 'v' se pudo encolar en la cola de 'aux':
			v->set_origen(aux->get_ubicacion()); //Seteo origen y pos_actual de 'v' relativos al semaforo 'aux'
			v->set_posicionActual(aux->get_ubicacion());
		}
		else cout<<"El semaforo estaba colmado. No se pudo insertar el vehiculo mat.: "<<v->get_matricula()<<endl;			
	}
	else cout<<"Error en la busqueda del semaforo (UbicarAleatorio) "<<endl;
}
	void iniciar(char** argv) {
		logger->log("Arranca la fila de la calesita",info);

		//recibe pipes
		int fdReadPuerta,fdWritePuerta;

		fdReadPuerta = toInt(argv[1]);
		fdWritePuerta  = toInt(argv[2]);

		pipeEntrePuertas = new Pipe(fdReadPuerta,fdWritePuerta);
		pipeEntrePuertas->setearModo(Pipe::LECTURA);

		//agarra semaforo
		semColaCal = new Semaforo(ARCH_SEM, SEM_COLA_CAL);
		int res = semColaCal->crear();
		if ( controlErrores1(res, logger, info) == MUERTE_POR_ERROR) { kill(ppid,SIGINT);}
	}
Exemple #13
0
int main()
{
	Semaforo semaforo;
	while (semaforo.buscar() != NULL)
	{
		Nodo* actual = semaforo.buscar();
		semaforo.asignar(actual);
		semaforo.buscarPermitidos();
	}

	semaforo.sortGraph();
	semaforo.print();

	while(true)
	{

	}
}
/**
 * THREAD -> Crea los servidores de partidas
 */
void* establecerPartidas(void* data) {
	pid_t pid;
	int idJugador;
	int idOponente;
	int nroPartida = 1;
	string nombreSemaforo;
	int i = 1;
	while (!torneoFinalizado()) {
		cout << "pasada de busqueda nro: " << i++ << " PID:" << getpid() << endl;

		//recorro la lista de jugadores viendo a quien le puedo asignar un oponente y que comienze la partida
		cout << "mutex establecerPartidas" << endl;
		pthread_mutex_lock(&mutex_listJugadores);
		for (map<int, Jugador*>::iterator it = listJugadores.begin(); it != listJugadores.end(); it++) {
			idJugador = it->first;
			idOponente = it->second->obtenerOponente();

			//si no se encuentra jugando actualmente y se encontro un oponente lanzo el servidor de partida
			if (idOponente > 0) {
				//habilito el temporizador del torneo
				if (nroPartida == 1) {
					cout << "Se crea la primer partida y doy permiso a iniciar el temporizador" << endl;
					sem_inicializarTemporizador.V();
				}
				nroPartida++;

				puertoPartida++;

				key_t key = ftok("/bin/ls", puertoPartida);
				if (key == -1) {
					cout << "Error al generar clave de memoria compartida" << endl;
					break;
				}
				cout<<"ftok key generada: "<<key<<endl;
				int idShm = shmget(key, sizeof(struct puntajesPartida) * 1, IPC_CREAT | PERMISOS_SHM);
				if (idShm == -1) {
					cout << "Error al obtener memoria compartida" << endl;
					break;
				}
				cout << "SERV TORNEO Partida: " << puertoPartida << "  ID SHM: " << idShm << endl;

				//inicializo el BLOQUE DE SHM
				puntajesPartida* resumenPartida = (struct puntajesPartida *) shmat(idShm, (char *) 0, 0);
				resumenPartida->idJugador1 = idJugador;
				resumenPartida->idJugador2 = idOponente;
				resumenPartida->jugando = true;
				resumenPartida->keepAlivePartida = true;
				resumenPartida->keepAliveTorneo = true;
				resumenPartida->puntajeJugador1 = 0;
				resumenPartida->puntajeJugador2 = 0;

				//genero y cargo los datos de la partida en una lista
				datosPartida structuraDatosPartida;
				structuraDatosPartida.idShm = idShm;
				structuraDatosPartida.lecturasFallidasSHM_Partida = 0;

				string nombreSemaforoPartida = "/" + intToString(puertoPartida) + "_Partida";
				string nombreSemaforoTorneo = "/" + intToString(puertoPartida) + "_Torneo";
				Semaforo* semaforoPartida = new Semaforo(nombreSemaforoPartida.c_str(), 1);
				Semaforo* semaforoTorneo = new Semaforo(nombreSemaforoTorneo.c_str(), 0);
				structuraDatosPartida.semaforo_pointerSem_t_Partida = semaforoPartida->getSem_t();
				structuraDatosPartida.semaforo_pointerSem_t_Torneo = semaforoTorneo->getSem_t();

				cout << "SERV TORNEO nombre SEM Torneo" << semaforoTorneo->getName() << endl;
				cout << "SERV TORNEO nombre SEM Partida" << semaforoPartida->getName() << endl;
				cout << "SERV TORNEO Sem_t * semaforo Torneo: " << semaforoTorneo->getSem_t() << endl;
				cout << "SERV TORNEO Sem_t * semaforo Partida: " << semaforoPartida->getSem_t() << endl;

				cout << "mutex establecerPartidas partidasActivas" << endl;
				pthread_mutex_lock(&mutex_partidasActivas);
				partidasActivas.push_back(structuraDatosPartida);
				pthread_mutex_unlock(&mutex_partidasActivas);
				cout << "unmutex establecerPartidas partidasActivas" << endl;

				//Le mando a los jugadores el nro de Puerto en el que comenzara la partida
				char auxPuertoNuevaPartida[LONGITUD_CONTENIDO];
				sprintf(auxPuertoNuevaPartida, "%d", puertoPartida);
				string message(CD_PUERTO_PARTIDA);
				message.append(fillMessage(auxPuertoNuevaPartida));

				cout << "Puerto para partida " << message << endl;
				listJugadores[idJugador]->SocketAsociado->SendNoBloq(message.c_str(), message.length());
				listJugadores[idOponente]->SocketAsociado->SendNoBloq(message.c_str(), message.length());

				if ((pid = fork()) == 0) {
					//Proceso hijo. Hacer exec
					cout << "J" << idJugador << " Crear Partida en el puerto: " << (puertoPartida - 1) << " (" << idJugador << "vs" << idOponente << ")" << endl;

					char auxCantVidas[2];
					sprintf(auxCantVidas, "%d", cantVidas);

					char *argumentos[] = { auxPuertoNuevaPartida, auxCantVidas, NULL };
					execv("../Servidor Partida/Debug/Servidor Partida", argumentos);
					cout << "ERROR al ejecutar execv Nueva Partida" << endl;
					exit(1);
				} else if (pid < 0) {
					//Hubo error
					cout << "Error al forkear" << endl;
				} else {
					//Soy el padre.
				}
			} else {
				//cout << "J" << idJugador << " No puede jugar" << endl;
			}
		}
		pthread_mutex_unlock(&mutex_listJugadores);
		cout << "unmutex establecerPartidas" << endl;

		usleep(INTERVALO_ENTRE_BUSQUEDA_DE_OPONENTES);
	}

	cout << "Thread EstablecerPartidas va a hacer un Exit" << endl;
	pthread_exit(NULL);
}
Exemple #15
0
int main(int argc, char* argv[]) {

	if (argc <= 1) {
		cout << "Error: No hay direccion del archivo" << endl;
		return -1;
	}

	if (argc >= 3 && !strcmp(argv[1],"-t")) {
		for(int i = 2; i < argc; ++i) {
			/* Los hijos del proceso realizarán el interior del if,
			  *termina en exit(0), para que los hijos no realicen el for */
			if(!fork()) {
				procesa_xml(argv[i],i); // i representará el m_type con que enviará mensajes al buzón
				exit(0);
			}
		}

		// Semáforos para impresor-padre
		Semaforo mySemaphore;
		Semaforo sonSemaphore;

		struct tag {
			char tag_name[MAX_CHAR]; // Nombre de la etiqueta
			int cantidad_tag;		// Cantidad de la etiqueta
		};

		int share_mem_id = shmget(KEY, sizeof(tag)*BUFER_SIZE, 0700 | IPC_CREAT);	// Memoria compartida

		int share_mem_id_i = shmget(KEY_i, sizeof(int), 0700 | IPC_CREAT);				// Memoria compartida
		int* i_share = (int*) shmat( share_mem_id_i, NULL, 0 );
		*(i_share) = 0;

		/* Codigo de hijo impresor */
		if(!fork()) {
			const tag* const area = (tag*) shmat( share_mem_id , NULL, 0 );
			cout << "\nConteo de etiquetas de los archivos en orden alfabetico\n" << endl;
			cout << left << setw(28) << "Nombre de la etiqueta" << "Numero de veces" << endl;
			cout.fill('_'); cout << left << setw(42) << ' ' << '\n' << endl;

			mySemaphore.wait(); // Espera la primera llamada del padre
			while(*(i_share) != -1){
				for(int i = 0; i < *(i_share); ++i){
					cout.fill(' '); cout << left << setw(28) << area[i].tag_name << right << setw(8) << area[i].cantidad_tag << endl;
				}
				sonSemaphore.signal();	// Signal al proceso padre
				mySemaphore.wait();		// Se queda esperando a la proxima estructura a ejecutar
			}

			cout.fill('_'); cout << left << setw(43) << ' ' << endl;
			sonSemaphore.signal();
			exit(0);
		}

		/* Instrucciones que realizará el padre */

		tag tmp;

		// Vectores que se utilizarán para el ordenamiento alfabético de las estructuras
		tag tagVec[argc];
		bool  flagVec[argc];

		for(int i = 2; i < argc; ++i) {
			flagVec[i] = true;
		}

		// Llena los vectores con los primeros mensajes enviados por los hijos
		for(int i = 2; i < argc; ++i) {
			myMailbox.recibir(tmp.tag_name,MAX_CHAR,tmp.cantidad_tag,i,0);
			strcpy(tagVec[i].tag_name,tmp.tag_name);
			tagVec[i].cantidad_tag = tmp.cantidad_tag;
		}

		// Los mensajes de los hijos que tengan "END", indican que terminó su ejecución
		for(int i = 2; i < argc; ++i) {
			if(!strcmp(tagVec[i].tag_name,"END"))
				flagVec[i] = false;
		}

		tag* area = (tag*) shmat(share_mem_id , NULL, 0);
		char bandera = ' ';

		// Extrae la menor etiqueta y la envía a impresión
		bool finish = false;
		do {
			int index_menor_etiqueta = 2;
			for(int i = 3; i < argc; ++i) {
				if(flagVec[i]) {
					int comparacion = strcmp(tagVec[i].tag_name,tagVec[index_menor_etiqueta].tag_name);
					if( comparacion < 0 ) { // tagVec[i].tag_name es menor
						index_menor_etiqueta = i;
					}
					else if(comparacion == 0 && index_menor_etiqueta != i) {
						/* Como hay 2 etiquetas iguales, se pasará a sumar las etiqeutas a alguna de las 2
						 * luego, se pedirá la siguiente etiqueta (buzón) para que no hayan conflictos */
						tagVec[index_menor_etiqueta].cantidad_tag += tagVec[i].cantidad_tag;
						myMailbox.recibir(tmp.tag_name,MAX_CHAR,tmp.cantidad_tag,i,0);
						strcpy(tagVec[i].tag_name,tmp.tag_name);
						if(!strcmp(tagVec[i].tag_name,"END"))
							flagVec[i] = false;
						tagVec[i].cantidad_tag = tmp.cantidad_tag;
					}
				}
			}

			if(bandera != tagVec[index_menor_etiqueta].tag_name[1] && bandera != ' '){
				mySemaphore.signal();
				sonSemaphore.wait();
				*(i_share) = 0;
			}

			// Envía los datos a impresor
			strcpy(area[*i_share].tag_name,tagVec[index_menor_etiqueta].tag_name);
			area[*i_share].cantidad_tag = tagVec[index_menor_etiqueta].cantidad_tag;
			*(i_share) += 1;

			bandera = tagVec[index_menor_etiqueta].tag_name[1];

			// Al sacar el menor del vector, se llama a la siguiente etiqueta
			myMailbox.recibir(tmp.tag_name,MAX_CHAR,tmp.cantidad_tag,index_menor_etiqueta,0);
			strcpy(tagVec[index_menor_etiqueta].tag_name,tmp.tag_name);
			if(!strcmp(tagVec[index_menor_etiqueta].tag_name,"END"))
				flagVec[index_menor_etiqueta] = false;
			tagVec[index_menor_etiqueta].cantidad_tag = tmp.cantidad_tag;

			bool tmp = true;
			for(int i = 2; i < argc; ++i){
				if(flagVec[i])
					tmp = false;
			}

			if(tmp)
				finish = true;

		} while(!finish);

		mySemaphore.signal();
		sonSemaphore.wait(); // Envía el último estructura de etiquetas al impresor

		*(i_share) = -1;
		mySemaphore.signal();
		sonSemaphore.wait();
		shmdt(area);
		shmctl( share_mem_id, IPC_RMID, NULL );
		shmctl( share_mem_id_i, IPC_RMID, NULL );

		mySemaphore.destroy();
		sonSemaphore.destroy();
	}
	else {
		// Caso de un solo archivo
		procesa_xml_un_archivo(argv[1]);
	}
	myMailbox.destroy();
	return 0;
}
/*
 * destruye los ipc
 */
int main(int argc, char** argv) {

    Logger::init(PATH_LOG,argv[0]);
    
    //destruir mutex
    Semaforo mutex = Semaforo(PATH_IPC_MUTEX.c_str());
    mutex.destroy();
    (Logger::getLogger())->escribir(MSJ,"Mutex destruido.");
    
    //destruir sem museo lleno
    Semaforo museo_lleno = Semaforo(PATH_IPC_MUSEOLLENO.c_str());
    museo_lleno.destroy();
    (Logger::getLogger())->escribir(MSJ,"Semaforo de museo lleno destruido.");
    
    //obtener memoria compartida
    key_t key = ftok(PATH_IPC_SHM.c_str(),SHM);
    int shm_id = shmget(key,sizeof(MUSEO),0666);
    if (shm_id == -1) {
        (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo obtener la memoria compartida para destruirla.");
        Logger::destroy();
        exit(1);
    }
    
    MUSEO* museo_shm = static_cast<MUSEO*>(shmat(shm_id,0,0));
    if (museo_shm == (MUSEO*)(-1)) {
        (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo inicializar la memoria compartida.");
        Logger::destroy();
        exit(1);
    }
    
    //obtengo la cant de puertas
    int cantidad_puertas = museo_shm->cant_puertas;
    
    int res = shmdt(museo_shm);
    if (res < 0) {
        (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo desatachear la memoria compartida al inicializar.");
        Logger::destroy();
        exit(1);
    }
    
    //elimino la memoria
    res = shmctl(shm_id,IPC_RMID,NULL);
    if (res == -1) {
        (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo destruir la memoria compartida.");
        Logger::destroy();
        exit(1);
    }
    (Logger::getLogger())->escribir(MSJ,"Memoria compartida destruida.");
    
    //eliminar colas de puertas
    static char puerta[MAX_DIG_PUERTA];
    
    for (int i=0;i<cantidad_puertas;i++) {
        sprintf(puerta,"%d",i);
        
        //eliminar cola entrada
        key_t key = ftok(PATH_IPC_COLAENTRADA.c_str(),i);
        int id_cola = msgget(key,0666);
        if (id_cola == -1) {
            (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo obtener la cola de entrada para la puerta "+puerta+" para eliminarla.");
            Logger::destroy();
            exit(1);
        }
        int res = msgctl(id_cola,IPC_RMID,NULL);
        if (res == -1) {
            (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo destruir la cola de entrada para puerta "+puerta+".");
            Logger::destroy();
            exit(1);
        }
        Logger::getLogger()->escribir(MSJ,string("Eliminada exitosamente cola de entrada para puerta ")+puerta+".");

        //eliminar cola entrada respuesta
        key = ftok(PATH_IPC_COLAENTRADA_RESP.c_str(),i);
        id_cola = msgget(key,0666);
        if (id_cola == -1) {
            (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo obtener la cola de entrada de respuesta para la puerta "+puerta+" para eliminarla.");
            Logger::destroy();
            exit(1);
        }
        res = msgctl(id_cola,IPC_RMID,NULL);
        if (res == -1) {
            (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo destruir la cola de entrada de respuesta para puerta "+puerta+".");
            Logger::destroy();
            exit(1);
        }
        Logger::getLogger()->escribir(MSJ,string("Eliminada exitosamente cola de entrada de respuesta para puerta ")+puerta+".");

        //eliminar cola de salida
        key = ftok(PATH_IPC_COLASALIDA.c_str(),i);
        id_cola = msgget(key,0666);
        if (id_cola == -1) {
            (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo obtener la cola de salida para la puerta "+puerta+" para eliminarla.");
            Logger::destroy();
            exit(1);
        }
        res = msgctl(id_cola,IPC_RMID,NULL);
        if (res == -1) {
            (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo destruir la cola de salida para puerta "+puerta+".");
            Logger::destroy();
            exit(1);
        }
        Logger::getLogger()->escribir(MSJ,string("Eliminada exitosamente cola de salida para puerta ")+puerta+".");

        //eliminar cola salida respuesta
        key = ftok(PATH_IPC_COLASALIDA_RESP.c_str(),i);
        id_cola = msgget(key,0666);
        if (id_cola == -1) {
            (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo obtener la cola de salida de respuesta para la puerta "+puerta+" para eliminarla.");
            Logger::destroy();
            exit(1);
        }
        res = msgctl(id_cola,IPC_RMID,NULL);
        if (res == -1) {
            (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo destruir la cola de salida de respuesta para puerta "+puerta+".");
            Logger::destroy();
            exit(1);
        }
        Logger::getLogger()->escribir(MSJ,string("Eliminada exitosamente cola de salida de respuesta para puerta ")+puerta+".");

    }
    
    //eliminar cola de museo cerrado
    key = ftok(PATH_IPC_COLAMUSEOCERRADO.c_str(),COLA_MUSEO_CERR);
    int cola_museo_cerrado = msgget(key,0666);
    if (cola_museo_cerrado == -1) {
        (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo obtener la cola de aviso de museo cerrado para eliminarla.");
        Logger::destroy();
        exit(1);
    }
    res = msgctl(cola_museo_cerrado,IPC_RMID,NULL);
    if (res == -1) {
        (Logger::getLogger())->escribir(ERROR,std::string(strerror(errno))+" No se pudo destruir la cola de aviso de museo cerrado.");
        Logger::destroy();
        exit(1);
    }
    Logger::getLogger()->escribir(MSJ,string("Eliminada exitosamente cola de de aviso de museo cerrado."));
    
    
    
    
    (Logger::getLogger())->escribir(MSJ,"------------------------------------------------------");
    Logger::destroy();
    return 0;
}