// verifica proximo pcb que deverá ser executado int pcb_caller(PCB* pcb_result) { if(fifo_aptos[P_ALTA].prim!=NULL) { *pcb_result = fifo_aptos[P_ALTA].prim->pcb; remove_fifo(&fifo_aptos[P_ALTA]); } else if(fifo_aptos[P_MEDIA].prim!=NULL) { *pcb_result = fifo_aptos[P_MEDIA].prim->pcb; remove_fifo(&fifo_aptos[P_MEDIA]); } else if(fifo_aptos[P_BAIXA].prim!=NULL) { *pcb_result = fifo_aptos[P_BAIXA].prim->pcb; remove_fifo(&fifo_aptos[P_BAIXA]); } else { return -1; // todas as filas estão vazias } return pcb_result->pid; }
void ler_fifo() { fifo *inst; int fda[2], sock; char res[30]; funcionario *f; while(1) { sem_wait(&sem_fifo); inst = remove_fifo(fifo_name); sem_post(&sem_fifo); if(inst == NULL) { usleep(20000); continue; } printf("%s - %s\n", inst->package, get_cmd(inst->package)); if(!strcmp(get_cmd(inst->package), "add")) { sem_wait(&sem_db); cadastrar_db(db, *(chartof(inst->package))); sem_post(&sem_db); printf("Cadastro Adicionado!\n"); continue; } printf("COnnect?\n"); if(!connect_inter(&sock, &(inst->addr))) continue; printf("COnectado\n"); if(!strcmp(get_cmd(inst->package), "rem")) { sem_wait(&sem_db); if(!remover_db(db, *(chartof(inst->package)))) { strcpy(res, "end|"); strcat(res, inet_ntoa(inst->addr.sin_addr)); enviar(sock, res); } else { printf("Cadastro Removido!\n"); enviar(sock, inst->package); } sem_post(&sem_db); close(sock); continue; } while(pipe(fda) == -1) { perror("pipe"); } f = chartof(inst->package); if(!fork()) { close(1); dup(fda[1]); close(fda[1]); close(fda[0]); sem_wait(&sem_db); consulta_db(db, f->nome, f->sobrenome, f->idade); sem_post(&sem_db); exit(0); } if(!fork()) { char resp[400]; close(0); dup(fda[0]); close(fda[1]); close(fda[0]); while(scanf("%s", resp) > 0) { strcat(resp, inet_ntoa(inst->addr.sin_addr)); memset(&resp[strlen(resp)], '\0', 400-strlen(resp)); printf("%s -> sending...\n", resp); enviar(sock, resp); } exit(0); } close(fda[0]); close(fda[1]); printf("Consulta Feita!"); close(sock); while(wait(NULL) > 0); } while(wait(NULL) > 0); }