//serverfile.h /*Nome do FIFO*/ #define n_fifosrv "SRVFIFO" /*Tam. Máximo para nome de ficheiro*/ #define MAX_FILE 50 /*Tam. do buffer*/ #define MAX_BUFFER 150 /*Estrutura de dados para pedido ao servidor*/ struct t_request { int pid; char name[50]; }; //server.c #include "TP3.h" #include "srvfile.h" /*fifo*/ int fsrv,fcli,ffile,n; void closefifo(int sinalrecebido) { close(fsrv); unlink(n_fifosrv); printf("\nFIFO FECHADO\n"); } void childclose(int sin) { int status; while(waitpid(-1, &status, WNOHANG) > 0); } /*fifo*/ char fexists(char *s) { FILE *f = fopen(s,"r"); if(f == NULL) return 0; fclose(f); return 1; } int VerificaSeExisteNome(PRODUTO *LP, int n, char* desig) { int i; for(i = 0; i < n; i++) { if(strcmp(LP[i].desig, desig) == 0) return i; } return -1; } void insereBD() { PRODUTO *BD; BD = (PRODUTO *)malloc(sizeof(PRODUTO)); int i = 0; FILE *fd = fopen("produtos", "w"); if(fd == NULL) exit(1); do { printf("Codigo Produto %d\n", i+1); BD->cod = i+1; printf("Descricao..."); if(i>0) fgets(BD->desig, 40,stdin); fgets(BD->desig, 40, stdin); if(strlen(BD->desig)==1) break; BD->desig[strlen(BD->desig)-1] = '\0'; printf("Preco..."); scanf("%f", &BD->preco); printf("Quantidade..."); scanf("%d", &BD->quanti); fflush(stdin); fprintf(fd, "%d\t%s\t%f\t%d\n",BD->cod,BD->desig,BD->preco,BD->quanti); i++; }while(1); fclose(fd); free(BD); } int CarregarFicheiro(PRODUTO *p) { FILE *f = fopen("produtos","r"); if(f == NULL) return; int n=0; char buffer[100]; while(fgets(buffer, sizeof buffer, f)) { sscanf(buffer,"%d%s%f%d", &p[n].cod, p[n].desig, &p[n].preco, &p[n].quanti); n++; } fclose(f); return n; } void main() { if(fexists("produtos") == 0) insereBD(); PRODUTO prod[MAX_PRODS]; int num_prods = CarregarFicheiro(prod); /*fifo*/ struct t_request request; char buffer[MAX_BUFFER],n_fcli[10]; int pesquisa; signal(SIGINT,closefifo); signal(SIGCHLD,childclose); unlink(n_fifosrv); n=mkfifo(n_fifosrv,0666); exit_on_error(n,"Erro a criar o FIFO"); fsrv=open(n_fifosrv,O_RDWR); exit_on_error(fsrv,"Abertura do FIFO"); while(read(fsrv,&request,sizeof(request)) > 0) { printf("PID:%d PRODUTO:%s\n",request.pid,request.name); if(fork() == 0) { pesquisa=VerificaSeExisteNome(prod,num_prods,request.name); sprintf(n_fcli,"%d",request.pid); fcli=open(n_fcli,O_WRONLY); if(pesquisa == -1) { sprintf(buffer,"Ficheiro Inexistente!\n"); write(fcli,&buffer,strlen(buffer)+1); close(fcli); exit(0); } sprintf(buffer,"Produto %s econtrado.\nPreco:%f\nQuantidade:%d\n", request.name, prod[pesquisa].preco, prod[pesquisa].quanti); write(fcli,&buffer,strlen(buffer)+1); close(fcli); exit(0); } } /*fifo*/ } //cliente.c #include #include #include #include #include #include #include #include "srvfile.h" #define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); } void main() { struct t_request request; char buffer[MAX_BUFFER],n_fifocli[10]; int fsrv,fcli,ffile,n; request.pid=getpid(); sprintf(n_fifocli,"%d",getpid()); fcli=mkfifo(n_fifocli,0666); exit_on_error(fcli,"Criação do FIFO"); while(1) { printf("\nPara sair escreva sair\n"); printf("Produto: "); fflush(stdin); gets(request.name); if(!strcmp(request.name,"sair")) break; fsrv=open(n_fifosrv,O_WRONLY); exit_on_error(fsrv,"Abertura do FIFO"); write(fsrv,&request,sizeof(request)); close(fsrv); fcli=open(n_fifocli,O_RDONLY); exit_on_error(fcli,"Abertura do FIFO"); while((n=read(fcli,&buffer,sizeof(buffer))) > 0) write(1,&buffer,n); printf("\n\n=======================================================\n"); close(fcli); } unlink(n_fifocli); }