Advertisement
Kimossab

SO TP2

May 4th, 2015
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.42 KB | None | 0 0
  1. //Cliente.c
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include "srvfile.h"
  9. #define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); }
  10.  
  11. void main()
  12. {
  13.     struct t_request request;
  14.     char buffer[MAX_BUFFER],n_fifocli[10];
  15.     int fsrv,fcli,ffile,n;
  16.     printf("File?");
  17.     scanf("%s",request.n_file);
  18.     request.pid=getpid();
  19.     sprintf(n_fifocli,"%d",getpid());
  20.     fcli=mkfifo(n_fifocli,0666);
  21.     exit_on_error(fcli,"Criação do FIFO");
  22.     fsrv=open(n_fifosrv,O_WRONLY);
  23.     exit_on_error(fsrv,"Abertura do FIFO");
  24.     write(fsrv,&request,sizeof(request));
  25.     close(fsrv);
  26.     fcli=open(n_fifocli,O_RDONLY);
  27.     exit_on_error(fcli,"Abertura do FIFO");
  28.     while((n=read(fcli,&buffer,sizeof(buffer))) > 0)
  29.         write(1,&buffer,n);
  30.     close(fcli);
  31.     unlink(n_fifocli);
  32. }
  33.  
  34. //Server.c
  35. #include <sys/types.h>
  36. #include <sys/stat.h>
  37. #include <fcntl.h>
  38. #include <unistd.h>
  39. #include <stdlib.h>
  40. #include <stdio.h>
  41. #include <signal.h>
  42. #include "srvfile.h"
  43. #define exit_on_error(s,m) if (s < 0) { perror(m); exit(1); }
  44.  
  45. int fsrv,fcli,ffile,n;
  46.  
  47. void closefifo(int sinalrecebido)
  48. {
  49.     close(fsrv);
  50.     unlink(n_fifosrv);
  51.     printf("\nFIFO FECHADO\n");
  52. }
  53.  
  54. void childclose(int sin)
  55. {
  56.     int status;
  57.     while(waitpid(-1, &status, WNOHANG) > 0);
  58. }
  59.  
  60. void main()
  61. {
  62.     struct t_request request;
  63.     char error[] = "Ficheiro Inexistente\n";
  64.     char buffer[MAX_BUFFER],n_fcli[10];
  65.     signal(SIGINT,closefifo);
  66.     signal(SIGCHLD,childclose);
  67.     unlink(n_fifosrv);
  68.     n=mkfifo(n_fifosrv,0666);
  69.     exit_on_error(n,"Erro a criar o FIFO");
  70.     fsrv=open(n_fifosrv,O_RDWR);
  71.     exit_on_error(fsrv,"Abertura do FIFO");
  72.     while(read(fsrv,&request,sizeof(request)) > 0)
  73.     {
  74.         printf("PID:%d FILE:%s\n",request.pid,request.n_file);
  75.         if(fork() == 0)
  76.         {
  77.             ffile=open(request.n_file,O_RDONLY);
  78.             sprintf(n_fcli,"%d",request.pid);
  79.             fcli=open(n_fcli,O_WRONLY);
  80.             if(ffile < 0)
  81.             {
  82.                 write(fcli,&error,sizeof(error));
  83.                 close(fcli);
  84.                 exit_on_error(ffile,"Abrir Ficheiro ");
  85.             }
  86.             while((n=read(ffile,&buffer,sizeof(buffer))) > 0)
  87.             {
  88.                 sleep(1);
  89.                 write(fcli,&buffer,n);
  90.             }
  91.             close(ffile);
  92.             close(fcli);
  93.             exit(0);
  94.         }
  95.     }
  96. }
  97.  
  98. //srvfile.h
  99. /*Nome do FIFO*/
  100. #define n_fifosrv "SRVFIFO"
  101. /*Tam. Máximo para nome de ficheiro*/
  102. #define MAX_FILE 50
  103. /*Tam. do buffer*/
  104. #define MAX_BUFFER 100
  105. /*Estrutura de dados para pedido ao servidor*/
  106. struct t_request
  107. {
  108.     int pid;
  109.     char n_file[50];
  110. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement