Processi figli e padre

di il
2 risposte

Processi figli e padre

Scrivere un programma C che prenda come parametri il nome di 4 file. Il
programma dovrà creare 3 processi figlio. Ogni figlio leggerà dal proprio file tre
caratteri comunicandoli al padre tramite PIPE. Il padre controllerà i caratteri letti,
se la sequenza di 3 caratteri ricevuta dai 3 figli risulterà la medesima questa
verrà stampata nel quarto file. Non appena uno dei figli terminerà la lettura del
suo file, tutti gli altri processi figlio dovranno anche questi terminare.

io l'ho fatto in questo modo , però non so dopo come tornare ai figli e far continuare a scrivere sulla pipe e poi ritornare ancora al padre vi prego qualcuno sa aiutarmi?

#include <sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc,char **argv){
   if(argc<4){
      perror("errore nel passaggio di parametri");
      exit(1);
   }
   int filedes[2],filedes2[2],filedes3[2],fd,fd2,fd3,fd4,i,status,n,flag=0;
   pid_t pid[3];
   char a[4],b[4],c[10];
   if(pipe(filedes)<0){
      perror("errore della prima pipe");
      exit(1);
   }
   if(pipe(filedes2)<0){
      perror("errore della seconda pipe");
      exit(1);
   }
   if(pipe(filedes3)<0){
      perror("errore della terza pipe");
      exit(1);
   }
   for(i=0;i<3;i++){
      pid[i]=fork();
      if(pid[i]<0){ 
         perror("errore di fork");
         exit(1);
      }
      if(pid[i]==0){
         if(i==0){
            printf("figlio 1 in azione\n");
            close(filedes[0]);
            if((fd=open(argv[1],O_RDONLY))<0){
               perror("errore di apertura del primo file");
               exit(1);
            }
            if(read(fd,a,3)<0){
               perror("errore di lettura sul primo file");
               exit(1);
            }
            if(write(filedes[1],a,3)<0){
               perror("errore di scrittura sulla prima pipe");
               exit(1);
            } 
            close(fd);
         }
         else if(i==1){
            printf("figlio 2 in azione\n");
            close(filedes2[0]);
            if((fd2=open(argv[2],O_RDONLY))<0){
               perror("errore di apertura del secondo file");
               exit(1);
            }
            if(read(fd2,b,3)<0){
               perror("errore di lettura sul secondo file");
               exit(1);
            }
            if(write(filedes2[1],b,3)<0){
               perror("errore di scrittura sulla seconda pipe");
               exit(1);
            } 
            close(fd2);
         }
         else if(i==2){
            printf("figlio 3 in azione\n");
            close(filedes3[0]);
            if((fd3=open(argv[3],O_RDONLY))<0){
               perror("errore di apertura del terzo file");
               exit(1);
            }
            if(read(fd3,c,3)<0){
               perror("errore di lettura sul terzo file");
               exit(1);
            }
            if(write(filedes3[1],c,3)<0){
               perror("errore di scrittura sulla terza pipe");
               exit(1);
            } 
            close(fd3);
         }
         exit(0); 
      }
      else{
         wait(&status);
         if(i==2){
            close(filedes[1]);
            close(filedes2[1]);
            close(filedes3[1]);
            if((fd4=open(argv[4],O_WRONLY))<0){
               perror("errore di apertura del quarto file");
               exit(1);
            }
            if((n=read(filedes[0],a,3))<0){
               perror("errore di lettura dalla prima pipe");
               exit(1);
            }          
            if((n=read(filedes2[0],b,3))<0){
               perror("errore di lettura dalla seconda pipe");
               exit(1);
            }
            if((n=read(filedes3[0],c,3))<0){
               perror("errore di lettura dalla terza pipe");
               exit(1);
            }
            printf("prima stringa %s \n",a);    
            printf("seconda stringa %s \n",b);   
            printf("terza stringa %s \n",c);   
            if((strcmp(a,c))==0)
               flag=1;
            if(flag==1){
               if((strcmp(a,b))==0){
                  if(write(fd4,a,3)<0){
                     perror("errore di scrittura sul quarto file");
                     exit(1);
                   }
                }
             }
         }
      }
   }
   exit(0);
}   

2 Risposte

  • Re: Processi figli e padre

    Ragazzi credo di averlo risolto ho solo due problemi perfavore aiutatemi:
    1. nei 3 file ho scritto abccde le tre stringhe leggeranno prima "abc" poi "cde" e poi per due volte solo "de" qualcuno sa spiegarmi il perchè?
    2 nonostante le 3 stringhe abbiano gli stessi caratteri lo strcmp fallisce sapreste spiegarmi il motivo?
    ho scoperto comunque che è solo la seconda stringa che da problemi
    
    #include <sys/types.h>
    #include<sys/stat.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc,char **argv){
       if(argc<4){
          perror("errore nel passaggio di parametri");
          exit(1);
       }
       int filedes[2],filedes2[2],filedes3[2],fd,fd2,fd3,fd4,i,status,n,flag=0,m=0,x=0,o=0;
       pid_t pid[3];
       char a[4],s[4],c[10];
       if(pipe(filedes)<0){
          perror("errore della prima pipe");
          exit(1);
       }
       if(pipe(filedes2)<0){
          perror("errore della prima pipe");
          exit(1);
       }
       if(pipe(filedes3)<0){
          perror("errore della prima pipe");
          exit(1);
       }
       for(i=0;i<3;i++){
          pid[i]=fork();
          if(pid[i]<0){ 
             perror("errore di fork");
             exit(1);
          }
          if(pid[i]==0){
             if(i==0){
                printf("figlio 1 in azione\n");
                close(filedes[0]);
                if((fd=open(argv[1],O_RDONLY))<0){
                   perror("errore di apertura del primo file");
                   exit(1);
                }
                while((n=read(fd,a,3))>0){
                   fflush(stdin);
                   if(write(filedes[1],a,3)<0){
                      perror("errore di scrittura sulla prima pipe");
                      exit(1);
                   }
                }
             }
             else if(i==1){
                printf("figlio 2 in azione\n");
                close(filedes2[0]);
                if((fd2=open(argv[2],O_RDONLY))<0){
                   perror("errore di apertura del secondo file");
                   exit(1);
                }
                while((n=read(fd2,a,3))>0){
                   fflush(stdin);
                   if(write(filedes2[1],a,3)<0){
                      perror("errore di scrittura sulla prima pipe");
                      exit(1);
                   }
                }
                close(fd2);
             }
             else if(i==2){
                printf("figlio 3 in azione\n");
                close(filedes3[0]);
                if((fd3=open(argv[3],O_RDONLY))<0){
                   perror("errore di apertura del terzo file");
                   exit(1);
                }
               while((n=read(fd3,a,3))>0){
                   fflush(stdin);
                   if(write(filedes3[1],a,3)<0){
                      perror("errore di scrittura sulla prima pipe");
                      exit(1);
                   }
                }
                close(fd3);
             }
             exit(0); 
          }
          else{
             wait(&status);
             if(i==2){ 
                printf("padre in azione\n");
                close(filedes[1]);
                close(filedes2[1]);
                close(filedes3[1]);
                if((fd4=open(argv[4],O_WRONLY))<0){
                   perror("errore di apertura del quarto file");
                   exit(1);
                }
              do{   
                   fflush(stdin);
                   n=read(filedes[0], a, 3);
                   fflush(stdin);
                   m=read(filedes2[0], s, 3);
                   fflush(stdin);
                   x=read(filedes3[0], c, 3);
                   printf("prima stringa %s \n",a);    
                   printf("seconda stringa %s \n",s);   
                   printf("terza stringa %s \n",c);   
                   if((strcmp(a,c))==0 && (strcmp(a,s))==0){
                      printf("ok");
                      if(write(fd4,a,3)<0){
                         perror("errore di scrittura sul quarto file");
                         exit(1);
                      }
                   }
                }while(n>0 && m>0 && x>0);
             }
          }
       }
       exit(0);
    }   
    
  • Re: Processi figli e padre

    Ho risolto il fatto che le stringhe me le segnava diverse
    però non so perchè adesso che fa mi fa due iterazioni in più il ciclo e come caratteri si prendere il carattere di a capo con le ultime due lettere del file
    
    #include <sys/types.h>
    #include<sys/stat.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc,char **argv){
       if(argc<4){
          perror("errore nel passaggio di parametri");
          exit(1);
       }
       int filedes[2],filedes2[2],filedes3[2],fd,fd2,fd3,fd4,i,status,n,flag=0,m=0,x=0,o=0;
       pid_t pid[3];
       char a[4],s[4],c[10];
       if(pipe(filedes)<0){
          perror("errore della prima pipe");
          exit(1);
       }
       if(pipe(filedes2)<0){
          perror("errore della prima pipe");
          exit(1);
       }
       if(pipe(filedes3)<0){
          perror("errore della prima pipe");
          exit(1);
       }
       for(i=0;i<3;i++){
          pid[i]=fork();
          if(pid[i]<0){ 
             perror("errore di fork");
             exit(1);
          }
          if(pid[i]==0){
             if(i==0){
                printf("figlio 1 in azione\n");
                close(filedes[0]);
                if((fd=open(argv[1],O_RDONLY))<0){
                   perror("errore di apertura del primo file");
                   exit(1);
                }
                while((n=read(fd,a,3))>0){
                   printf("ecco:%s\n",a );
                   if(write(filedes[1],a,3)<0){
                      perror("errore di scrittura sulla prima pipe");
                      exit(1);
                   }
                }
             }
             else if(i==1){
                printf("figlio 2 in azione\n");
                close(filedes2[0]);
                if((fd2=open(argv[2],O_RDONLY))<0){
                   perror("errore di apertura del secondo file");
                   exit(1);
                }
                while((n=read(fd2,a,3))>0){
                   printf("ecco:%s\n",a );
                   if(write(filedes2[1],a,3)<0){
                      perror("errore di scrittura sulla prima pipe");
                      exit(1);
                   }
                }
                close(fd2);
             }
             else if(i==2){
                printf("figlio 3 in azione\n");
                close(filedes3[0]);
                if((fd3=open(argv[3],O_RDONLY))<0){
                   perror("errore di apertura del terzo file");
                   exit(1);
                }
               while((n=read(fd3,a,3))>0){ 
                   printf("ecco:%s\n",a );
                   if(write(filedes3[1],a,3)<0){
                      perror("errore di scrittura sulla prima pipe");
                      exit(1);
                   }
                }
                close(fd3);
             }
             exit(0); 
          }
          else{
             wait(&status);
             if(i==2){ 
                printf("padre in azione\n");
                close(filedes[1]);
                close(filedes2[1]);
                close(filedes3[1]);
                if((fd4=open(argv[4],O_WRONLY))<0){
                   perror("errore di apertura del quarto file");
                   exit(1);
                }
              do{   
                   if((n=read(filedes[0],a,3))>0)
                      a[n]='\0';
                   m=read(filedes2[0],s,3);
                   if(m>0)
                      s[m]='\0';
                   x=read(filedes3[0],c,3);
                   if(x>0)
                      c[x]='\0';
                   printf("prima stringa %s \n",a);    
                   printf("seconda stringa %s \n",s);   
                   printf("terza stringa %s \n",c);   
                   if((strcmp(a,c))==0 && (strcmp(a,s))==0){
                      printf("ok");
                      if(write(fd4,a,3)<0){
                         perror("errore di scrittura sul quarto file");
                         exit(1);
                      }
                   }
                }while(n>0 && m>0 && x>0);
             }
          }
       }
       exit(0);
    }   
    
Devi accedere o registrarti per scrivere nel forum
2 risposte