Esempio n. 1
0
// 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;
}
Esempio n. 2
0
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);
}