コード例 #1
0
int enviarBloque(t_nodo *nodo, char *bloque, t_bloque *copiaBloque,SocketConecta *conexion)
{
	off_t bytesEnviados = 0;
	off_t bytesPorEnviar;
	off_t retorno;
	char respuestaNodo;
	off_t tamanio = tamanioDelBloque(bloque);
	marcarPosicionComoOcupadaEnArray(nodo->bloques,posicionLibreEnNodo(nodo->bloques));
	if(estaConectado(conexion))
		enviarMensaje(conexion,GRABAR_TEXTO,1);
	if (estaConectado(conexion))
		enviarMensaje(conexion,&copiaBloque->numeroDeBloqueEnNodo,sizeof(int));
	bytesPorEnviar = tamanio;
	while(bytesEnviados < bytesPorEnviar)
	{
		if(estaConectado(conexion))
		{
			retorno = enviarMensaje(conexion,(char*)(bloque + bytesEnviados),(bytesPorEnviar - bytesEnviados));

			if(retorno <= 0)
				break;
			bytesEnviados += retorno;
		}else
			return 0;
	}

	recibirMensaje(conexion,&respuestaNodo,sizeof(char));
	if (!estaConectado(conexion))
		return 0;
	nodo->bloquesUsados++;
	return 1;
}
コード例 #2
0
int procesarPedidoDeRecurso(char *cajaABuscar, Nivel *nivel, int socketNivel, t_queue *objetosABuscar, int socketPlanificador, int socketOrquestador) {
	int recursoAsignado;
	log_debug(logger, "El personaje: (%s) pedira el recurso (%s) porque llego a la caja correspondiente.", personaje->nombre, cajaABuscar);
	recursoAsignado = pedirRecurso(*cajaABuscar, socketNivel);
	if (!recursoAsignado) {
		log_debug(logger, "El personaje:(%s) se bloqueo a causa de que el recurso (%s) no esta disponible", personaje->nombre, cajaABuscar);
		avisarDelBloqueo(socketPlanificador, cajaABuscar);
		esperarDesbloqueo(socketOrquestador);
		if (!queue_is_empty(objetosABuscar)) {
			log_debug(logger, "El personaje (%s) fue desbloqueado y continua con el nivel.", personaje->nombre);
			MPS_MSG msgAEnviar;
			armarMensaje(&msgAEnviar,CONTINUA_NIVEL,1,"1");
			enviarMensaje(socketPlanificador,&msgAEnviar);
		}else{
			log_debug(logger, "El personaje (%s) fue desbloqueado y termina el nivel.", personaje->nombre);
			MPS_MSG msgAEnviar;
			armarMensaje(&msgAEnviar,TERMINA_NIVEL,1,"1");
			enviarMensaje(socketPlanificador,&msgAEnviar);
			close(socketPlanificador);
			return true;
		}

	} else {
		log_debug(logger, "El personaje: (%s) recibio el recurso(%s) con exito!", personaje->nombre, cajaABuscar);
		if (!queue_is_empty(objetosABuscar)) {
			recursoObtenido(socketPlanificador);
		}
	}

	return false;
}
コード例 #3
0
int avisarFinalizacion(int socketNivel, int socketPlanificador) {
	MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
	mensajeAEnviar->PayloadDescriptor = FINALIZAR;
	mensajeAEnviar->PayLoadLength = sizeof(char);
	mensajeAEnviar->Payload = "F";
	enviarMensaje(socketNivel, mensajeAEnviar);
	enviarMensaje(socketPlanificador, mensajeAEnviar);
	free(mensajeAEnviar);
	return 0;
}
コード例 #4
0
int correr_path(void){



	char path[30];


  //limpiar pantalla
	//system("clear");


	printf(BLANCO "Ingresar nombre del mcod: \n" FINDETEXTO);

	scanf("%s", path);

	//FERNILANDIA
	char mensajeParaPreguntarExistenciaDeArchivo = 'A';
	enviarMensaje(socketMaestro, &mensajeParaPreguntarExistenciaDeArchivo, sizeof(mensajeParaPreguntarExistenciaDeArchivo));
	size_t tamanioPath = strlen(path) + sizeof(char);
	enviarMensaje(socketMaestro, &tamanioPath, sizeof(tamanioPath));
	enviarMensaje(socketMaestro, path, tamanioPath);

	char existenciaDeArchivo = 'Z';
	recibirMensajeCompleto(socketMaestro, &existenciaDeArchivo, sizeof(char));

	if(existenciaDeArchivo == 'E'){
		printf(ROJO "ERROR" BLANCO ": No existe el mcod ingresado.\n" FINDETEXTO);
	}
	//FIN DE FERNILANDIA
	else{
		contador_de_id_procesos++; // mantengo la cuenta de todos los procesos que se crearon en el sistema

		pthread_mutex_lock(&pcbs);
		// Agrego el elemento al final de la lista (para que quede ordenada por ID)
		list_add(lista_de_PCB, PCB_create(contador_de_id_procesos, 1, 'R', path, time(NULL), time(NULL)));

		pthread_mutex_unlock(&pcbs);

		pthread_mutex_lock(&ready);
		// agrego la id a lo ultimo de la cola
		queue_push(procesos_en_ready,id_create(contador_de_id_procesos));

		pthread_mutex_unlock(&ready);

		printf("Proceso %s en ejecucion....\n", path);

		log_trace(proceso, "              INICIO --> ID_mproc: %d , nombre: %s ",contador_de_id_procesos, path);

		sem_post(&solicitud_ejecucion);
	}
	//sleep(1);

	return 0;
}
コード例 #5
0
//---------------funcion encargado de recibir conexiones de CPUs   -------------------------
int recibir_conexion(){


	int socketCpu;
	int id;


		socketCpu = crearSocketParaAceptarSolicitudes(socketEscucha); //

		recibirMensajeCompleto(socketCpu, &id, sizeof(int));// recibo id de CPU


		pthread_mutex_lock(&cpuss);

		list_add(CPUs, cpu_create(id,1,socketCpu)); // guardo en la lista

		pthread_mutex_unlock(&cpuss);

		enviarMensaje(socketCpu,&quantum,sizeof(quantum)); // le mando el quantum, que es un int

		FD_SET(socketCpu, &master); // Agrega socketCpu al master set
		if (socketCpu > fdmax) { // es el mayor
			fdmax = socketCpu; // guardo el mayor
		}

		read_fds = master; // actualizo el temporal

		sem_post(&solicitud_cpuLibre); // desperta a al hilo "ejecutar_proceso"


	return 0;
}
コード例 #6
0
void realizarMovimiento(Posicion* posicionActual, Posicion* posicion, int socketNivel) {
	MPS_MSG* mensaje = malloc(sizeof(MPS_MSG));
	MPS_MSG mensajeConfirmacion;
	log_debug(logger, "El personaje esta ubicado en X:(%d) Y:(%d)", posicionActual->x, posicionActual->y);
	log_debug(logger, "El personaje procede a moverse a la caja en X:(%d) Y:(%d)", posicion->x, posicion->y);
	if (posicionActual->x != posicion->x) {
		if (posicionActual->x < posicion->x) {
			posicionActual->x++;
		} else if (posicionActual->x > posicion->x) {
			posicionActual->x--;
		}
	} else if (posicionActual->y != posicion->y) {
		if (posicionActual->y < posicion->y) {
			posicionActual->y++;
		} else if (posicionActual->y > posicion->y) {
			posicionActual->y--;
		}
	}
	Posicion* posicionNueva = malloc(sizeof(Posicion));
	posicionNueva->x = posicionActual->x;
	posicionNueva->y = posicionActual->y;
	armarMensaje(mensaje, AVISO_MOVIMIENTO, sizeof(Posicion), posicionNueva);
	enviarMensaje(socketNivel, mensaje);
	recibirMensaje(socketNivel, &mensajeConfirmacion);
	if (mensajeConfirmacion.PayloadDescriptor == MOVIMIENTO_EXITO) {
		log_debug(logger, "El personaje se movio a X:(%d) Y:(%d)", posicionActual->x, posicionActual->y);
	}
	free(mensaje);
	free(posicionNueva);
}
コード例 #7
0
void recorrerNivel(int socketNivel, int socketPlanificador, int socketOrquestador) {
	Nivel *nivel = queue_peek(personaje->listaNiveles);
	Posicion* posicion = malloc(sizeof(Posicion));
	Posicion* posicionActual = malloc(sizeof(Posicion));
	t_queue *objetosABuscar = queue_create();
	copiarCola(nivel->objetos, objetosABuscar);
	posicionActual->x = 0;
	posicionActual->y = 0;
	notificarIngresoAlNivel(socketNivel);
	esperarConfirmacion(socketNivel);
	log_debug(logger, "Confirmacion del nivel");
	notificarIngresoAlNivel(socketPlanificador);
	esperarConfirmacion(socketPlanificador);
	log_debug(logger, "Confirmacion del Planificador");
	int ubicacionCorrecta;
	int terminoPorDesbloqueo = false;
	log_debug(logger, "El personaje:(%s) empieza a recorrer el nivel (%s)", personaje->nombre, nivel->nombre);
	while (!queue_is_empty(objetosABuscar)) {
		char *cajaABuscar;
		ubicacionCorrecta = 0;
		while (!ubicacionCorrecta && !queue_is_empty(objetosABuscar)) {
			cajaABuscar = queue_pop(objetosABuscar);
			log_debug(logger, "Consultando ubicacion de la proxima caja del recurso (%s)", cajaABuscar);
			ubicacionCorrecta = consultarUbicacionCaja(*cajaABuscar, socketNivel, posicion);
		}
		if (estaEnPosicionDeLaCaja(posicion, posicionActual) && ubicacionCorrecta) {
			esperarConfirmacionDelPlanificador(socketPlanificador);
			terminoPorDesbloqueo = procesarPedidoDeRecurso(cajaABuscar, nivel, socketNivel, objetosABuscar, socketPlanificador, socketOrquestador);
		}
		while (!estaEnPosicionDeLaCaja(posicion, posicionActual) && ubicacionCorrecta) {

			log_debug(logger, "El personaje:(%s) esta a la espera de la confirmacion de movimiento", personaje->nombre);

			esperarConfirmacionDelPlanificador(socketPlanificador);

			log_debug(logger, "El personaje:(%s) tiene movimiento permitido, se procede a moverse", personaje->nombre);
			realizarMovimiento(posicionActual, posicion, socketNivel);
			log_debug(logger, "El personaje:(%s) se movio satisfactoriamente", personaje->nombre);
			if (estaEnPosicionDeLaCaja(posicion, posicionActual)) {
				terminoPorDesbloqueo = procesarPedidoDeRecurso(cajaABuscar, nivel, socketNivel, objetosABuscar, socketPlanificador, socketOrquestador);
			} else {
				movimientoRealizado(socketPlanificador);
			}
		}
		if (queue_is_empty(objetosABuscar) && !terminoPorDesbloqueo) {
			log_debug(logger, "El personaje: (%s) procede a informar la finalizacion del nivel al planificador.", personaje->nombre);
			MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
			mensajeAEnviar->PayloadDescriptor = FINALIZAR;
			mensajeAEnviar->PayLoadLength = sizeof(char);
			mensajeAEnviar->Payload = "4";
			enviarMensaje(socketPlanificador, mensajeAEnviar);
			close(socketPlanificador);
		}
	}
	nivelTerminado(socketNivel);
	close(socketNivel);
	queue_pop(personaje->listaNiveles);
	free(posicion);
	free(nivel);
}
コード例 #8
0
void obtenerSiguienteConjuntosRegistrosRemotos(SocketConecta *conexion, ArchivoLocal *archivoALeer)
{
	if(! estaConectado(conexion))
	{
		cerrarArchivo((Archivo *)archivoALeer);
		finalizarAtencionAConexion(conexion);
	}

	uint64_t tamanioCojuntoRegistros = 0;
	char conjuntoRegistros[SIZE_CONJUNTO_REGISTROS];
	conjuntoRegistros[0] = '\0';

	uint64_t tamanioSiguienteRegistro = obtenerTamanioSiguienteRegistro(archivoALeer);
	while(tamanioSiguienteRegistro > 0 && tamanioCojuntoRegistros + tamanioSiguienteRegistro + 1 < SIZE_CONJUNTO_REGISTROS)
	{
		char *registro = obtenerRegistro((Archivo *) archivoALeer);
		tamanioCojuntoRegistros += strlen(registro);
		strcat(conjuntoRegistros, registro);
		free(registro);

		tamanioSiguienteRegistro = obtenerTamanioSiguienteRegistro(archivoALeer);
	}

	if (tamanioCojuntoRegistros == 0)
		enviarMensaje(conexion, &tamanioCojuntoRegistros, sizeof(uint64_t));
	else
		enviarTodo(conexion, conjuntoRegistros, tamanioCojuntoRegistros);
}
コード例 #9
0
void recursoObtenido(int socketPlanificador) {
	log_debug(logger, "El personaje:(%s) procede a avisarle al planificador que obtuvo un recurso", personaje->nombre);
	MPS_MSG* mensaje = malloc(sizeof(MPS_MSG));
	armarMensaje(mensaje, OBTUVO_RECURSO, sizeof(char), "6");
	enviarMensaje(socketPlanificador, mensaje);
	free(mensaje);
}
コード例 #10
0
void movimientoRealizado(int socketPlanificador) {
	log_debug(logger, "El personaje:(%s) procede a avisarle al planificador de su movimiento", personaje->nombre);
	MPS_MSG* mensaje = malloc(sizeof(MPS_MSG));
	armarMensaje(mensaje, AVISO_MOVIMIENTO, sizeof(char), "3");
	enviarMensaje(socketPlanificador, mensaje);
	free(mensaje);
}
コード例 #11
0
void avisarAlNivel(t_enemigo * enemigo){
	//TODO ver como consigo el fd del Planificador

	int i;
	ITEM_NIVEL * personaje;

	t_list * listaPersonajesAtacados = obtenerListaDePersonajesAbajoDeEnemigo(enemigo);
	if (list_size(listaPersonajesAtacados) > 0){
		char * simbolosPersonajesAtacados = string_new();
		for(i=0 ; i < list_size(listaPersonajesAtacados) ; i++){
			personaje = list_get(listaPersonajesAtacados,i);
			string_append(&simbolosPersonajesAtacados, charToString(personaje->id));
		}
		//TODO tengo que sacar los personajes de la lista de personajes?
		//while(list_size(listaPersonajesAtacados) > 0){
		//	list_remove(listaPersonajesAtacados,0);
		//}
		//TODO tengo que sacar los personajes de la lista de personajes?
		while(list_size(listaPersonajesAtacados) > 0){
			ITEM_NIVEL * persAtacado = list_get(listaPersonajesAtacados,0);
			int i = 0;
			bool encontrado = false;
			while(i<list_size(items) && !encontrado){
				ITEM_NIVEL * elem = list_get(items,i);
				if (elem->item_type == PERSONAJE_ITEM_TYPE)
					if (strcmp(charToString(persAtacado->id), charToString(elem->id)) == 0){
						encontrado = true;
						pthread_mutex_lock(&mx_lista_items);
						list_remove(items,i);
						//TODO ver si no hay que actulizar el mapa
						pthread_mutex_unlock(&mx_lista_items);
					}
				i++;
			}
			list_remove(listaPersonajesAtacados,0);
		}




		if(IMPRIMIR_INFO_ENEMIGO){
			pthread_mutex_lock(&mutex_log);
			log_info(logger,"El enemigo atacó a los personajes: %s ", simbolosPersonajesAtacados);
			pthread_mutex_unlock(&mutex_log);
		}

		//if (PRUEBA_CON_CONEXION)
		if(true){
			pthread_mutex_lock(&mutex_mensajes);
			enviarMensaje(socketDeEscucha, NIV_enemigosAsesinaron_PLA, simbolosPersonajesAtacados);
			pthread_mutex_unlock(&mutex_mensajes);
		}


		free(simbolosPersonajesAtacados);
	}
	list_clean(listaPersonajesAtacados); //TODO, con esto libero todos los elementos de la lista o tengo q recorrerla e ir liberando?

}
コード例 #12
0
void notificarMuerte() {
	MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
	mensajeAEnviar->PayloadDescriptor = MUERTE_PERSONAJE;
	mensajeAEnviar->PayLoadLength = sizeof(char);
	mensajeAEnviar->Payload = personaje->simbolo;
	enviarMensaje(socketPlanificador, mensajeAEnviar);
	free(mensajeAEnviar);
}
コード例 #13
0
void liberarRecursos() {
	MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
	mensajeAEnviar->PayloadDescriptor = MUERTE_PERSONAJE;
	mensajeAEnviar->PayLoadLength = sizeof(char);
	mensajeAEnviar->Payload = personaje->simbolo;
	enviarMensaje(socketNivel, mensajeAEnviar);
	free(mensajeAEnviar);
}
コード例 #14
0
static void recibirYChequearConexionNodo(SocketConecta *socket,void * mensaje, int tam,SocketConecta *marta,int idOp)
{
		recibirMensaje(socket,mensaje,tam);
		if(!estaConectado(socket))
		{
			//Le aviso a marta que la rutina fallo porque se desconecto el nodo
			pthread_mutex_lock(&semaforoMarta);
			int dos=2;
			enviarMensaje(marta,&dos,sizeof(int));
			enviarMensaje(marta,&idOp,sizeof(int));
			logCabeceraEnvia("Id de map");
			pthread_mutex_unlock(&semaforoMarta);
			logCabeceraEnvia("Fallo map, se desconecto el nodo");
			mostrarFinalizacion(1,idOp);
			pthread_exit(0);
		}
}
コード例 #15
0
void avisarDelBloqueo(int socketPlanificador, char* recursoPedido) {
	log_debug(logger, "El personaje:(%s) procede a avisar que esta bloqueado.", personaje->nombre);
	MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
	mensajeAEnviar->PayloadDescriptor = BLOQUEO_PERSONAJE;
	mensajeAEnviar->PayLoadLength = sizeof(char);
	mensajeAEnviar->Payload = recursoPedido;
	enviarMensaje(socketPlanificador, mensajeAEnviar);
	free(mensajeAEnviar);
}
コード例 #16
0
void nivelTerminado(int socket) {
	log_debug(logger, "El personaje:(%s) procede a avisar el fin del nivel al nivel", personaje->nombre);
	MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
	mensajeAEnviar->PayloadDescriptor = FINALIZAR;
	mensajeAEnviar->PayLoadLength = sizeof(char);
	mensajeAEnviar->Payload = "F";
	enviarMensaje(socket, mensajeAEnviar);
	free(mensajeAEnviar);
}
コード例 #17
0
static void *avisarNodoInexisteYTerminarConexion(SocketConecta *conexion, char *puertoNodo, char *nombreNodo, char *ipNodo)
{
	free(puertoNodo);
	free(nombreNodo);
	free(ipNodo);
	enviarMensaje(conexion,NODO_INEXISTENTE,sizeof(char));
	loguear(LOG_LEVEL_INFO,"Un nodo intento conectarse como existente, pero no existe y se lo desconecto");
	deleteSocketConecta(conexion);
	return NULL;
}
コード例 #18
0
ファイル: subscriptor.c プロジェクト: Dinuuu/SDSockets
int fin_subscriptor() {
	if (puerto == 0)
		return -1;
	enviarMensaje(APAGADO, puerto);
	close(socketAbierto);
	socketAbierto = 0;
	puerto = 0;
	threadId = 0;
	return 0;
}
コード例 #19
0
ファイル: subscriptor.c プロジェクト: Dinuuu/SDSockets
int inicio_subscriptor(void (*notif_evento)(const char *, const char *),
		void (*alta_tema)(const char *), void (*baja_tema)(const char *)) {

	if (puerto != 0)
		return -1;

	notifi = notif_evento;
	notifi_alta = alta_tema;
	notifi_baja = baja_tema;
	int s;
	struct sockaddr_in dir;
	int opcion = 1;

	if ((s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
		perror("error creando socket");
		return 1;
	}

	/* Para reutilizar puerto inmediatamente
	 */
	if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opcion, sizeof(opcion)) < 0) {
		perror("error en setsockopt");
		return 1;
	}

	dir.sin_addr.s_addr = INADDR_ANY;
	dir.sin_port = 0;
	dir.sin_family = PF_INET;
	if (bind(s, (struct sockaddr *) &dir, sizeof(dir)) < 0) {
		perror("error en bind");
		close(s);
		return 1;
	}

	if (listen(s, MAX_LISTEN) < 0) {
		perror("error en listen");
		close(s);
		return 1;
	}

	struct sockaddr_in aux;
	int tam = sizeof(aux);
	getsockname(s, (void*) &aux, (socklen_t *) &tam);

	puerto = ntohs(aux.sin_port);
	socketAbierto = s;
	if (enviarMensaje(INICIO, puerto) < 0)
		return -1;
	pthread_create(&threadId, NULL, bucleAccept, (void*) s);

	return 0;
}
コード例 #20
0
static void subirArchivoResultadoAMDFS(SocketConecta *conexionConJob, char *nombreArchivo)
{
	int sizePathArchivoEnMDFS;
	recibirMensaje(conexionConJob, &sizePathArchivoEnMDFS, sizeof(int));

	char *pathArchivoEnMDFS = malloc(sizePathArchivoEnMDFS + 1);
	recibirMensaje(conexionConJob, pathArchivoEnMDFS, sizePathArchivoEnMDFS);
	pathArchivoEnMDFS[sizePathArchivoEnMDFS] = '\0';

	int resultadoDeSubida = conectarAFilesystemYSubirArchivo(nombreArchivo, pathArchivoEnMDFS);

	enviarMensaje(conexionConJob, &resultadoDeSubida, sizeof(int));
}
コード例 #21
0
int pedirRecurso(char recursoAPedir, int socketNivel) {
	MPS_MSG* mensaje = malloc(sizeof(MPS_MSG));
	armarMensaje(mensaje, PEDIR_RECURSO, sizeof(char), &recursoAPedir);
	enviarMensaje(socketNivel, mensaje);
	recibirMensaje(socketNivel, mensaje);
	if (mensaje->PayloadDescriptor == SIN_RECURSOS) {
		log_debug(logger, "El recurso (%c) no esta disponible.", recursoAPedir);
		free(mensaje);
		return 0;
	}
	free(mensaje);
	return 1;
}
コード例 #22
0
void avisarFinalizacionDelPersonaje() {
	int socketOrquestador = conectarAlOrquestador();
	if (socketOrquestador == 1) {
		return;
	}
	MPS_MSG* mensajeAEnviar = malloc(sizeof(MPS_MSG));
	mensajeAEnviar->PayloadDescriptor = FINALIZO_NIVELES;
	mensajeAEnviar->PayLoadLength = sizeof(char);
	mensajeAEnviar->Payload = personaje->simbolo;
	log_debug(logger, "Se le avisa al orquestador de la finalizacion de todos los niveles");
	enviarMensaje(socketOrquestador, mensajeAEnviar);
	free(mensajeAEnviar);
}
コード例 #23
0
// porcenjes de usos de CPUs
void cpu(){

	int i=0;
	int tamano;
	int porcentaje;
	char timer[10];
	int contador = 1;
	char mensajito = '%';


	enviarMensaje(socketMaestro,&mensajito,sizeof(char)); // le mando el %, que es un int


	pthread_mutex_lock(&cpuss);

	tamano = list_size(CPUs);

	pthread_mutex_unlock(&cpuss);

	for(i = 0; i < tamano; i++){

		recibirMensajeCompleto(socketMaestro, &porcentaje, sizeof(int));// recibo los porcentajes

		printf(BLANCO "ID_CPU: " AZUL "%d " BLANCO "--> ", contador);

		if(porcentaje < 40){
			printf(VERDE "%d" BLANCO "%%\n" FINDETEXTO, porcentaje);
		}
		else{
			if(porcentaje >= 40 && porcentaje < 70){
				printf(AMARILLO "%d" BLANCO "%%\n" FINDETEXTO, porcentaje);
			}
			else{
				printf(ROJO "%d" BLANCO "%%\n" FINDETEXTO, porcentaje);
			}
		}


		contador++;

	}



	printf("\n   Ingrese un caracter y presione enter para volver al menu \n\n");


	scanf("%s",timer);


}
コード例 #24
0
int finalizar_PID(){

	char mensajito = 'C';
	int ultima; // cantidad de instrucciones
	int id;
	char timer[10];

	t_PCB *nodo_pcb;

	printf(BLANCO "\n   Ingrese el ID_mProc que desea finalizar: \n\n" FINDETEXTO);

	scanf("%d",&id);

	pthread_mutex_lock(&pcbs);


	if( ! (estas_finalizado(lista_de_PCB, id)) ){ // si no esta en la lista entra al if

		pthread_mutex_unlock(&pcbs);

		printf("\n" ROJO "ERROR" BLANCO ": No se pudo encontrar el ID del proceso ingresado\n\n" FINDETEXTO);

		scanf("%s",timer);

		return 0;
	}


	enviarMensaje(socketMaestro,&mensajito,sizeof(char)); // le mando el quantum, que es un int


	nodo_pcb = buscar_PCB(lista_de_PCB, id); //PCB=buscar_id_de_proceso (sin desarmar la lista)


	enviarPath(socketMaestro ,nodo_pcb); // envio el path al CPU


	pthread_mutex_unlock(&pcbs);

	recibirMensajeCompleto(socketMaestro, &ultima, sizeof(int));// recibo la ultima instruccion

	pthread_mutex_lock(&pcbs);

	nodo_pcb->pc = ultima; // le cambio el estado a finalizado

	list_add(id_finalizados,id_create(nodo_pcb->id));

	pthread_mutex_unlock(&pcbs);

	return 0;
}
コード例 #25
0
ArchivoLocal *tengoArchivo(SocketConecta *conexion)
{
	char *pathCompleto = obtenerPathCompleto(conexion);

	loguear(LOG_LEVEL_INFO, "Se recibio un pedido de archivo de parte de un nodo. Archivo: %s", pathCompleto);

	ArchivoLocal *archivoALeer = newArchivoLocal(pathCompleto, LECTURA);

	if (! estaConectado(conexion))
	{
		if (archivoALeer != NULL)
			cerrarArchivo((Archivo *)archivoALeer);

		finalizarAtencionAConexion(conexion);
	}

	if (archivoALeer == NULL)
		enviarMensaje(conexion,NO_TENGO_ARCHIVO,1);
	else
		enviarMensaje(conexion,SI_TENGO_ARCHIVO,1);

	return archivoALeer;
}
コード例 #26
0
void terminoDePedir(SocketConecta *conexion, ArchivoLocal *archivoALeer)
{
	loguear(LOG_LEVEL_INFO, "Se termino la transferencia del archivo");

	if(! estaConectado(conexion))
	{
		cerrarArchivo((Archivo*) archivoALeer);
		finalizarAtencionAConexion(conexion);
	}

	char termino = SI_TERMINO;

	enviarMensaje(conexion,&termino,1);

	cerrarConexionYArchivo(conexion,archivoALeer);
}
コード例 #27
0
ファイル: servidor.c プロジェクト: allanpa88/tareaProgramadaI
 int main() {
	int opcion;
	do {
		opcion =  Menu();
		switch(opcion) {
			case 1:
				agregarContacto();
			break;
			case 2:
				//consultarContactos();
				enviarMensaje();
			break;
		 }
	} while (opcion != 0);
	
	return 0;
}
コード例 #28
0
int consultarUbicacionCaja(char cajaABuscar, int socketNivel, Posicion* posicion) {
	MPS_MSG* mensaje = malloc(sizeof(MPS_MSG));
	MPS_MSG* mensajeARecibir = malloc(sizeof(MPS_MSG));
	armarMensaje(mensaje, UBICACION_CAJA, sizeof(char), &cajaABuscar);
	enviarMensaje(socketNivel, mensaje);
	recibirMensaje(socketNivel, mensajeARecibir);
	if (mensajeARecibir->PayloadDescriptor == CAJAFUERALIMITE) {
		log_debug(logger, "El personaje %s no puede acceder a la caja (%c) porque esta fuera del limite", personaje->nombre, cajaABuscar);
		free(mensaje);
		free(mensajeARecibir);
		return 0;
	}
	*posicion = *(Posicion*) mensajeARecibir->Payload;
	log_debug(logger, "La caja necesaria esta en X:(%d) Y:(%d)", posicion->x, posicion->y);
	free(mensaje);
	free(mensajeARecibir);
	return 1;
}
コード例 #29
0
static void notificarResultado(Tarea *tarea, SocketConecta *conexion, int resultadoDeTarea)
{
	enviarMensaje(conexion, &resultadoDeTarea, 4);

	if (esMap(tarea))
	{
		loguearYMostrarEnPantalla(LOG_LEVEL_INFO, "Ejecucion de map terminada.\n\tBloque : %d\n\tRutina: %s\n\tSalida: %s\n\tResultado: %d",
				tarea->bloque,
				tarea->pathRutina,
				tarea->nombreArchivoResultado,
				resultadoDeTarea);
	}
	else
	{
		loguearYMostrarEnPantalla(LOG_LEVEL_INFO, "Ejecucion de reduce terminada.\n\tRutina: %s\n\tSalida: %s\n\tResultado: %d",
						tarea->pathRutina, tarea->nombreArchivoResultado, resultadoDeTarea);
	}
}
コード例 #30
0
ファイル: test2.cpp プロジェクト: p431i7o/online-home-control
int main(int argc,char ** argv){
	char opcion;
	int contador=0;
//	extern char *optarg;
	while((opcion = getopt(argc,argv,"f:"))!=-1){
		if(opcion=='f'){
	            printf("\nEnviando comando!\n");
		    enviarMensaje(optarg);
            	}else{	
			printf("\n\r====Ayuda=======\n");
 		        printf("\n\rUsar la opcion -f  ");
	                printf("\nCodigo hex para enviar.");
			printf("\n\rPor ejemplo: ");
			printf("\nsudo ./rpi-transmiter -f 0x880001AA\n");
		}
		if(contador<5){ return 0; } else { return 2;}
	}

}