Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //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 <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <signal.h>
- #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);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement