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; }
int lvid_create(union lvid *lvid, struct id *vgid) { memcpy(lvid->id, vgid, sizeof(*lvid->id)); return id_create(&lvid->id[1]); }