Advertisement
Kimossab

SO TP3

May 21st, 2015
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.15 KB | None | 0 0
  1. //serverfile.h
  2. /*Nome do FIFO*/
  3. #define n_fifosrv "SRVFIFO"
  4. /*Tam. Máximo para nome de ficheiro*/
  5. #define MAX_FILE 50
  6. /*Tam. do buffer*/
  7. #define MAX_BUFFER 150
  8. /*Estrutura de dados para pedido ao servidor*/
  9. struct t_request
  10. {
  11.     int pid;
  12.     char name[50];
  13. };
  14.  
  15. //server.c
  16. #include "TP3.h"
  17. #include "srvfile.h"
  18. /*fifo*/
  19. int fsrv,fcli,ffile,n;
  20.  
  21. void closefifo(int sinalrecebido)
  22. {
  23.     close(fsrv);
  24.     unlink(n_fifosrv);
  25.     printf("\nFIFO FECHADO\n");
  26. }
  27.  
  28. void childclose(int sin)
  29. {
  30.     int status;
  31.     while(waitpid(-1, &status, WNOHANG) > 0);
  32. }
  33. /*fifo*/
  34.  
  35.  
  36. char fexists(char *s)
  37. {
  38.     FILE *f = fopen(s,"r");
  39.     if(f == NULL)
  40.         return 0;
  41.     fclose(f);
  42.     return 1;
  43. }
  44.  
  45. int VerificaSeExisteNome(PRODUTO *LP, int n, char* desig)
  46. {
  47.     int i;
  48.     for(i = 0; i < n; i++)
  49.     {
  50.         if(strcmp(LP[i].desig, desig) == 0)
  51.                 return i;
  52.  
  53.     }
  54.     return -1;
  55. }
  56.  
  57. void insereBD()
  58. {
  59.         PRODUTO *BD;
  60.         BD = (PRODUTO *)malloc(sizeof(PRODUTO));
  61.         int i = 0;
  62.  
  63.         FILE *fd = fopen("produtos", "w");
  64.         if(fd == NULL) exit(1);
  65.  
  66.         do
  67.         {
  68.                 printf("Codigo Produto %d\n", i+1);
  69.                 BD->cod = i+1;
  70.                 printf("Descricao...");
  71.                 if(i>0) fgets(BD->desig, 40,stdin);
  72.                 fgets(BD->desig, 40, stdin);
  73.                 if(strlen(BD->desig)==1) break;
  74.         BD->desig[strlen(BD->desig)-1] = '\0';
  75.                 printf("Preco...");
  76.                 scanf("%f", &BD->preco);
  77.                 printf("Quantidade...");
  78.                 scanf("%d", &BD->quanti);
  79.                 fflush(stdin);
  80.                 fprintf(fd, "%d\t%s\t%f\t%d\n",BD->cod,BD->desig,BD->preco,BD->quanti);
  81.                 i++;
  82.         }while(1);
  83.  
  84.         fclose(fd);
  85.         free(BD);
  86. }
  87.  
  88. int CarregarFicheiro(PRODUTO *p)
  89. {
  90.     FILE *f = fopen("produtos","r");
  91.     if(f == NULL)
  92.         return;
  93.    
  94.     int n=0;
  95.  
  96.     char buffer[100];
  97.     while(fgets(buffer, sizeof buffer, f))
  98.     {
  99.         sscanf(buffer,"%d%s%f%d", &p[n].cod, p[n].desig, &p[n].preco, &p[n].quanti);
  100.         n++;
  101.     }
  102.     fclose(f);
  103.     return n;
  104. }
  105.  
  106. void main()
  107. {
  108.     if(fexists("produtos") == 0)
  109.         insereBD();
  110.     PRODUTO prod[MAX_PRODS];
  111.     int num_prods = CarregarFicheiro(prod);
  112.  
  113.     /*fifo*/
  114.     struct t_request request;
  115.     char buffer[MAX_BUFFER],n_fcli[10];
  116.     int pesquisa;
  117.     signal(SIGINT,closefifo);
  118.     signal(SIGCHLD,childclose);
  119.     unlink(n_fifosrv);
  120.     n=mkfifo(n_fifosrv,0666);
  121.     exit_on_error(n,"Erro a criar o FIFO");
  122.     fsrv=open(n_fifosrv,O_RDWR);
  123.     exit_on_error(fsrv,"Abertura do FIFO");
  124.     while(read(fsrv,&request,sizeof(request)) > 0)
  125.     {
  126.         printf("PID:%d PRODUTO:%s\n",request.pid,request.name);
  127.         if(fork() == 0)
  128.         {
  129.             pesquisa=VerificaSeExisteNome(prod,num_prods,request.name);
  130.             sprintf(n_fcli,"%d",request.pid);
  131.             fcli=open(n_fcli,O_WRONLY);
  132.             if(pesquisa == -1)
  133.             {
  134.                 sprintf(buffer,"Ficheiro Inexistente!\n");
  135.                 write(fcli,&buffer,strlen(buffer)+1);
  136.                 close(fcli);
  137.                 exit(0);
  138.             }
  139.             sprintf(buffer,"Produto %s econtrado.\nPreco:%f\nQuantidade:%d\n", request.name, prod[pesquisa].preco, prod[pesquisa].quanti);
  140.             write(fcli,&buffer,strlen(buffer)+1);
  141.             close(fcli);
  142.             exit(0);
  143.         }
  144.     }
  145.     /*fifo*/
  146. }
  147.  
  148. //cliente.c
  149. #include <sys/types.h>
  150. #include <sys/stat.h>
  151. #include <fcntl.h>
  152. #include <unistd.h>
  153. #include <stdlib.h>
  154. #include <stdio.h>
  155. #include <signal.h>
  156. #include "srvfile.h"
  157. #define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); }
  158.  
  159. void main()
  160. {
  161.     struct t_request request;
  162.     char buffer[MAX_BUFFER],n_fifocli[10];
  163.     int fsrv,fcli,ffile,n;
  164.  
  165.     request.pid=getpid();
  166.     sprintf(n_fifocli,"%d",getpid());
  167.     fcli=mkfifo(n_fifocli,0666);
  168.     exit_on_error(fcli,"Criação do FIFO");
  169.    
  170.     while(1)
  171.     {
  172.         printf("\nPara sair escreva sair\n");
  173.         printf("Produto: ");
  174.         fflush(stdin);
  175.         gets(request.name);
  176.         if(!strcmp(request.name,"sair"))
  177.             break;
  178.         fsrv=open(n_fifosrv,O_WRONLY);
  179.         exit_on_error(fsrv,"Abertura do FIFO");
  180.         write(fsrv,&request,sizeof(request));
  181.         close(fsrv);
  182.         fcli=open(n_fifocli,O_RDONLY);
  183.         exit_on_error(fcli,"Abertura do FIFO");
  184.         while((n=read(fcli,&buffer,sizeof(buffer))) > 0)
  185.             write(1,&buffer,n);
  186.         printf("\n\n=======================================================\n");
  187.         close(fcli);
  188.     }
  189.     unlink(n_fifocli);
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement