int selectInterrupt(global tabla){
	if(mtexto)printf("INTERRUPCION.I--%s\n",tabla.cabecera->name);
	int i=0,respuesta,status=1,fdmax=*(tabla.maxfd);
	char mensaje[128],mensajeError[64],numero[16],data[8];
	answer aux;
	fd_set readfds;
	readfds=*(tabla.original->original);
	if(selectGRID_planificador(fdmax,&readfds)>0){
		while ((!FD_ISSET(i,&readfds))&&(i<=fdmax)){
			i++;
		}
		log_trace(tabla.logging.trace,"\t\t\t------INTERRUPT------\t\t\t","TRACE");
		strcpy(mensaje,"Nº:I");
		itoa(i,numero,10);
		strcat(mensaje,"--Socket:(Esp./Recv.)-Msj:(Esp./Recv.)-(Msj/Cont/Dat/Sym)--Duenio:  --(N/");
		strcat(mensaje,numero);
		strcat(mensaje,")--(");
		if (i>fdmax){
			if(mtexto)puts("--ERROR:No se encontro candidato para selectear!!--");
			strcpy(mensajeError,"Nº:I");
			strcat(mensajeError,"-ERROR:No se encontro candidato para selectear!!");
			log_info(tabla.logging.info,mensaje,"ERROR");
			exit(1);
		}else{
			if(mtexto)printf("INTERRUPCION.MID.I--%s\n",tabla.cabecera->name);
			respuesta=recvAnswer(&aux,i);
			if(mtexto)printf("INTERRUPCION.MID.F--%s\n",tabla.cabecera->name);
			strcat(mensaje,"ALL/");
			itoa((int)aux.msg,numero,10);
			strcat(mensaje,numero);
			strcat(mensaje,")--(");
			strcat(mensaje,numero);
			itoa((int)aux.cont,numero,10);
			strcat(mensaje,"/");
			strcat(mensaje,numero);
			strcat(mensaje,"/");
			data[0]=aux.data;
			data[1]='\0';
			strcat(mensaje,data);
			strcat(mensaje,"/");
			data[0]=aux.symbol;
			data[1]='\0';
			strcat(mensaje,data);
			strcat(mensaje,")--Duenio:");
			if(i==tabla.cabecera->nid)	strcat(mensaje,tabla.cabecera->name);
			else {
				data[0]=buscarSimbolo(i,tabla);
				data[1]='\0';
				strcat(mensaje,data);
			}
			strcat(mensaje,".");
			log_trace(tabla.logging.trace,mensaje,"TRACE");
			status=interrupcion(i,respuesta,&aux,tabla);
			log_trace(tabla.logging.trace,"\t\t\t------INTERRUPT------\t\t\t","TRACE");
		}
	}
	if(mtexto)printf("INTERRUPCION.F--%s\n",tabla.cabecera->name);
	//}while(muerto);
	return status;
}
/**
 * Aca se atiende todos lo que llega desde la CPU.
 * Interfaz expuesta a la CPU.
 */
void _atender_socket_cpu(conexion_cpu_t* conexion_cpu)
{
	if(conexion_cpu == NULL)
		return;

	char* mensaje;
	uint32_t len;

	int32_t resultado = recibir(conexion_cpu->socket, &mensaje, &len);

	tcb_t* tcbKM = get_tcb_km();

	if(resultado == 0)
	{
		flag_t cod_op = codigo_operacion(mensaje);

		printf("-- Recibimos request de CPU %d\n", conexion_cpu->id);
		printf("");
		bloquear_exit();

		printf("- Codigo de operacion %d\n", cod_op);
		printf("");
		switch (cod_op) {

			case MANDA_TCB:
				printf("Pedido de TCB de CPU %d\n", conexion_cpu->id);
				printf("");
				pedir_tcb(conexion_cpu->id);
				break;

			case TOMA_RESULTADO:
				;
				pedido_con_resultado_t* pedido_resultado = deserializar_pedido_con_resultado_t(mensaje);

				if(!proceso_muriendo(pedido_resultado->tcb->pid))
				{	// Recibimos el TCB y esta todos OK
					printf("Recibimos TCB con resultado %d\n", pedido_resultado->resultado);
					printf("");
					recibir_tcb(pedido_resultado->resultado, pedido_resultado->tcb);
				}
				else if(pedido_resultado->tcb->km)
				{	// Recibimos el TCB de un proceso muriendo, siendo este el TCB KM (hay que replanificar KM?)
					//eliminar_conclusion_tcb();

					replanificar_tcb_km();
				}
				else
				{// Recibimos el TCB de un proceso muriendo
					// Creo que en este caso no hay que hacer nada
				}

				_enviar_completadook(conexion_cpu->socket);

				free(pedido_resultado->tcb);
				free(pedido_resultado);

				planificar();
				break;

			case INTERRUPCION:
				;
				pedido_interrupcion_t* pedido_interrupcion = deserializar_pedido_interrupcion_t(mensaje);

				logear_instruccion_protegida("INTERRUPCION", pedido_interrupcion->tcb);

				if(!proceso_muriendo(pedido_interrupcion->tcb->pid))
					interrupcion(pedido_interrupcion->tcb, pedido_interrupcion->direccion_de_memoria);

				_enviar_completadook(conexion_cpu->socket);


				free(pedido_interrupcion->tcb);
				free(pedido_interrupcion);
				break;

			case ENTRADA_ESTANDAR:
				logear_instruccion_protegida("ENTRADA ESTANDAR", get_tcb_km());

				pedido_entrada_estandar_t* pedido_entrada = deserializar_pedido_entrada_estandar_t(mensaje);

				if(!proceso_muriendo(tcbKM->pid))
				{
					if(enviar_entrada_estandar(pedido_entrada) == 0)
					{

					}
					else
					{
						//_informar_fallo_syscall(conexion_cpu->socket);
					}
				}

				free(pedido_entrada);
				break;

			case SALIDA_ESTANDAR:
				logear_instruccion_protegida("SALIDA ESTANDAR", get_tcb_km());

				pedido_salida_estandar_t* pedido_salida = deserializar_pedido_salida_estandar_t(mensaje);


				if(!proceso_muriendo(tcbKM->pid))
				{
					if(salida_estandar(pedido_salida) == 0)
						_enviar_completadook(conexion_cpu->socket);
					else
					{
						_informar_fallo_syscall(conexion_cpu->socket);
					}
				}
				else
				{
					_enviar_completadook(conexion_cpu->socket);
				}

				free(pedido_salida->cadena_de_texto);
				free(pedido_salida);
				break;

			case JOIN:
				logear_instruccion_protegida("JOIN", get_tcb_km());

				pedido_join_t* pedido_join = deserializar_pedido_join_t(mensaje);


				if(!proceso_muriendo(tcbKM->pid))
					join(pedido_join->tid_llamador, pedido_join->tid_esperador);

				_enviar_completadook(conexion_cpu->socket);

				free(pedido_join);
				break;

			case BLOQUEAR:
				logear_instruccion_protegida("BLOQUEAR", get_tcb_km());

				pedido_bloquear_t* pedido_bloqueo = deserializar_pedido_bloquear_t(mensaje);

				// No usamos el TCB porque el que se esta bloqueando
				// es el que esta esperando la conclusion del KM

				if(!proceso_muriendo(tcbKM->pid))
					bloquear(pedido_bloqueo->identificador_de_recurso);

				_enviar_completadook(conexion_cpu->socket);

				free(pedido_bloqueo->tcb);
				free(pedido_bloqueo);
				break;

			case DESPERTAR:
				logear_instruccion_protegida("DESPERTAR", get_tcb_km());

				pedido_despertar_t* pedido_despertar = deserializar_pedido_despertar_t(mensaje);

				if(!proceso_muriendo(tcbKM->pid))
					despertar(pedido_despertar->identificador_de_recurso);

				_enviar_completadook(conexion_cpu->socket);

				free(pedido_despertar);
				break;

			case CREAR_HILO:
				logear_instruccion_protegida("CREAR HILO", get_tcb_km());

				pedido_crear_hilo_t* pedido_crea = deserializar_pedido_crear_hilo_t(mensaje);
				crea(pedido_crea->tcb, conexion_cpu->id);
				break;

			case DESCONEXION_CPU:
				loggear_desconexion_cpu(conexion_cpu->id);

				quitar_cpu_de_lista_espera_tcb(conexion_cpu->id);
				FD_CLR(conexion_cpu->socket->fd, &READFDS_CPUS);

				if(esta_ejecutando(conexion_cpu->id))
				{
					tcb_t* t = get_tcb_ejecutando_en_cpu(conexion_cpu->id);
					mover_tcbs_a_exit(t->pid, true);
				}

				remover_y_eliminar_conexion_cpu(conexion_cpu->id);

				break;

			case CREA_UN_SEGMENTO:
				;
				pedido_de_crear_segmento_t* pedido_crear_segmento = deserializar_pedido_de_crear_segmento_t(mensaje);
				crear_segmento_cpu(pedido_crear_segmento->pid, pedido_crear_segmento->tamano,&(conexion_cpu->id));
				break;

			case DESTRUI_SEGMENTO:
				;
				pedido_de_destruir_segmento_t* pedido_destruir_segmento = deserializar_pedido_de_destruir_segmento_t(mensaje);
				destruir_segmento_cpu(pedido_destruir_segmento->pid,pedido_destruir_segmento->direccion_virtual, &(conexion_cpu->id));
				break;

			default:
				break;
		}
		desbloquear_exit();
		printf("-- Terminamos request de CPU %d\n", conexion_cpu->id);
		printf("");

		free(mensaje);
	}
}