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;
}
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;
}
void* bloquear_procesos(){

	t_bloqueados *nodo_bloqueado;
	t_PCB *nodo_pcb;


	while(1){

		sem_wait(&solicitud_deBloqueo);

		pthread_mutex_lock(&bloqueados);
		// sacar un proceso de la cola de "procesos_bloqueados" (modificando la lista)
		nodo_bloqueado = queue_pop(procesos_bloqueados);
		pthread_mutex_unlock(&bloqueados);

		sleep(nodo_bloqueado->tiempo);

		pthread_mutex_lock(&pcbs);

		// una vez transcurrido ese tiempo buscar con la id en "lista_de_PCB" y sacar su PCB
		nodo_pcb = buscar_PCB(lista_de_PCB, nodo_bloqueado->id);

		// modificar su estado de: bloqueado a--> listo y meter de nuevo en "lista_de_PCB"
		nodo_pcb->estado = 'R'; // le cambio el valor que esta en memoria dinamica

		log_colas(nodo_pcb->id,nodo_pcb->path,"volvio por una E/S de:",nodo_bloqueado->tiempo);

		nodo_pcb->ultimaEspera = time(NULL); // guardo el tiempo en que entro a la cola de ready

		pthread_mutex_unlock(&pcbs);

		pthread_mutex_lock(&ready);
		// meter id de proceso en cola: "procesos_en_ready"
		queue_push(procesos_en_ready,id_create (nodo_bloqueado->id)); // ya hay un nuevo nodo en la cola

		pthread_mutex_unlock(&ready);

		free(nodo_bloqueado);

		sem_post(&solicitud_ejecucion);

	}

	return 0;
}
int llega_quantum(t_PCB *PCB){

	pthread_mutex_lock(&ready);
	// meter procesos en la cola de ready
	queue_push(procesos_en_ready,id_create(PCB->id));

	PCB->ultimaEspera = time(NULL); // guardo el tiempo en que entro a la cola de ready

	pthread_mutex_unlock(&ready);

	// actualizo el PCB
	PCB->estado = 'R'; // le cambio el valor que esta en memoria dinamica

	log_colas(PCB->id,PCB->path,"volvio por quantum de:",quantum);

	sem_post(&solicitud_ejecucion);

	return 0;

}
Example #5
0
int lvid_create(union lvid *lvid, struct id *vgid)
{
	memcpy(lvid->id, vgid, sizeof(*lvid->id));
	return id_create(&lvid->id[1]);
}