Advertisement
Guest User

es3

a guest
Apr 22nd, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.42 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <sys/wait.h>
  8.  
  9. #define MAX_CHILD_NUMBER 10
  10. /**************************/
  11. /* DICHIARAZIONE FUNZIONI */
  12. /**************************/
  13. void process_pn(int i, int pid);
  14. void figlio(char* filterc);
  15.  
  16. /*********************/
  17. /* VARIABILI GLOBALI */
  18. /*********************/
  19. int n;
  20. char* input;
  21. char* output;
  22. char* filterc[MAX_CHILD_NUMBER];
  23. int fd_n[2];
  24.  
  25. int main(int argc, char* argv[]){
  26.     int pid, i;
  27.    
  28.     if (argc < 4) {
  29.         fprintf(stderr, "Numero di argomenti errato.\nUsage:\n\t%s file1 file2 C\n",argv[0]);
  30.         exit(EXIT_FAILURE);
  31.     }
  32.  
  33.     input = argv[1];
  34.     n = argc - 3;
  35.  
  36.     for(i=0; i<n; i++)
  37.         filterc[i] = argv[i+2];
  38.    
  39.     output = argv[argc - 1];
  40.    
  41.     for (i=0; i<n; i++) {
  42.         pipe(fd_n);
  43.         pid = fork();
  44.         if (pid < 0){
  45.             fprintf(stderr, "P0: Errore nella fork");
  46.             exit(EXIT_FAILURE);
  47.         }
  48.         else
  49.             if (pid == 0) {
  50.                 process_pn(i, pid);
  51.             }
  52.         else {
  53.             printf("P0: creato figlio P%d con PID %d\n", i+1, pid);
  54.              close(0);
  55.         dup(fd_n[0]);
  56.         close(fd_n[0]);
  57.         }
  58.     }
  59.     exit(0);
  60.     return 0;
  61. }
  62. void process_pn(int i, int pid) {
  63.     int fd_in, fd_out, nread, size;
  64.     char* buf;
  65.     if(i==0 && pid==0) { /*INPUT*/
  66.         printf("P1 legge e salva in pipe\n");
  67.         close(0);
  68.         open(input, O_RDONLY);
  69.         close(fd_n[0]);
  70.         close(1);
  71.         dup(fd_n[1]);
  72.         close(fd_n[1]);
  73.         figlio(filterc[i]);
  74.     }
  75.     else
  76.     if(i==n-1 && pid==0) {/*OUTPUT*/
  77.         printf("P%d legge dalla pipe precedente e salva in output\n", i+1);
  78.         close(1);
  79.         open(output, O_WRONLY | O_CREAT, 0777);  
  80.         close(fd_n[1]);
  81.         close(fd_n[0]);
  82.         figlio(filterc[i]);
  83.     }
  84.     else if(pid == 0) {
  85.         printf("P%d legge dalla pipe precedente e scrive nella sua pipe\n", i+1);
  86.         close(1);
  87.         dup(fd_n[1]);
  88.         close(fd_n[1]);
  89.         figlio(filterc[i]);
  90.     }
  91.     return;  
  92. }
  93.  
  94. void figlio(char*filterc){
  95.     char c,d[2];
  96.     int i;
  97.     while((i=read(0,&c,sizeof(char)))>0){
  98.         d[0]=c;
  99.         d[1]='\0';
  100.         if(strcmp(filterc,d)!=0){
  101.             write(1,&c,sizeof(char));  
  102.         }      
  103.     }
  104.     close(1);
  105.     exit(0);
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement