Creare più processi figli

di il
30 risposte

Creare più processi figli

Salve ragazzi ho questo esercizio.
Generare 2 processi figli i quali leggeranno un file dato come argomento e scriveranno al padre solo le lettere successive ad una lettera passata come argomento.Successivamente il padre leggerà i caretteri scritti

int main(int argc,char **argv){
   char a[1]; // buffer per leggere all'interno del file
   pid_t pid[2]; // array per salvare i pid
   if (argc < 3){ // controllo delle variabili passate al programma
      perror("errore nel passaggio di parametri");
      exit(1);
   }
   int filedes[2],fd,fd2,n,flag=1,i=0,letti=0,status; 
   if((fd=open(argv[1],O_RDONLY))<0){  // apertura del file da leggere
      perror("errore nell'apertura del file");
      exit(1);
   }
   if((fd2=open(argv[2],O_WRONLY))<0){ // apertura del file in cui scrivere
      perror("errore");
      exit(1);
   }
   if(pipe(filedes)<0){ // crazione della pipe
      perror("errore di pipe");
      exit(1);
   }
   for(i=0;i<2;i++){ // ciclo per creare piu figli
      pid[i]=fork();
      if(pid[i]<0){
         perror("errore di fork");
         exit(1);
      }
      else if(pid[i]==0){ // processo figlio
         close(filedes[0]);
          while((n=read(fd,a,1))>0){ // leggi da file
             if(write(STDOUT_FILENO,a,n)<0){ // controlla se la scritura nel buffer è andata a buon fine
                perror("errore in lettura");
                close(fd);
                exit(1);
             }
             if(a==argv[3]) // controllo se ho trovato la lettera
                flag=1;
             if(flag==1){  // se il buffer  è 1 è il momento di scrivere nella pipe
                if(write(filedes[1],a,1)<0){  // controllo sulla scrittura
                   perror("errore in scrittura");
                   close (fd);
                }
                letti++;
            }
         }
         if(write(filedes[1],"letti",5)<0){ // ho scritto che ho finito di leggere
                   perror("errore in scrittura");
                   close(fd);
         }
         printf("questo è il flag %d\n",flag);
         flag=0;
         exit(0);
      }
      else if (pid[i]>0){ // processo padre
        printf("ok");
        if(wait(&status)==-1){ // aspetta i figli
           perror("errore per il processo figlio");
           close(fd);
           exit(1);
        }
         while((n=read(filedes[0],a,1))>0){ // leggi sulla pipe
            if(write(fd2,a,1)<0){
               perror("errore in lettura");
               exit(1);
            }
         }
      }
  }
  close (fd2);
  printf("FINE");
  exit(0);
  }

30 Risposte

  • Re: Creare più processi figli

    E qual è il problema? A parte il fatto che hai scritto tutto nel main() e che non hai scritto neanche un commento?
  • Re: Creare più processi figli

    Il problema è che se non sbaglio è come se eseguisse solo il primo figlio e poi mi fa inserire sempre valori e si blocca il terminale...so che è poco chiaro il codice ma non riesco proprio a capire l'errore
    ho messo i commenti perfavore puoi vedere se capisci dove sbaglio?
  • Re: Creare più processi figli

    I commenti come li hai messi tu lasciano il tempo che trovano.
    Prima di cimentarti un problematiche a mio avviso complesse come il fork() dovresti essere già in grado di scrivere una funzione: se scrivi delle funzioni semplifichi il lavoro e rendi il codice più leggibile. I commenti non saranno inutili come "apertura del file da leggere" ma saranno del tipo "funzione che gestisce il processo figlio, in input file da leggere e file da scrivere". Se scrivi tutto nel main continuerai a scrivere dei temi.
    Tornando al tuo problema, il fatto che ti parta un solo figlio è ovvio, qui
          else if (pid[i]>0){ // processo padre
            printf("ok");
    
    per decidere se aspettare i figli controlli solo di essere il processo padre, quindi ti fermi nella prima ciclata di for!
  • Re: Creare più processi figli

    Quindi il wait dove dovrebbe stare?
  • Re: Creare più processi figli

    Il wait potrebbe stare fuori dal for
  • Re: Creare più processi figli

    Ma se lo metto fuori dal for lo metto anche fuori dal processo padre giusto?
  • Re: Creare più processi figli

    Questo lo puoi (anzi lo devi) definire tu, le chiamate alla exit() a qualcosa serviranno
  • Re: Creare più processi figli

    Ti ringrazio davvero per le risposte ma ora sono confuso. In pratica la fork dovrebbe creare un processo figlio in questo processo figlio metto l'exit altrimenti continuerebbe ad essere eseguito.Ma non mi trovo con il wait al di fuori del processo padre. Se io lo metto fuori il padre chi aspettae soprattutto perchè dovrebbe essere proprio il padre ad aspettare
  • Re: Creare più processi figli

    perchè dovrebbe essere proprio il padre ad aspettare
    perchè farai in modo che sia l'unico a non fare exit (e quindi l'unico a non terminare l'esecuzione)
  • Re: Creare più processi figli

    Hmm quindi dovrei aggiungere una cosa del genere a fine codice?
    
    for(i=0;i<n;i++)
    waitpid(pid[i],NULL,0);
    
    ho provato e ancora non va
  • Re: Creare più processi figli

    Proprio non riesco a capire perchè non va
  • Re: Creare più processi figli

    Semplifica il tuo codice, eliminando ad esempio le letture/scritture, ed inserisci delle printf() che indichino "processo figlio partito", "processo figlio terminato" etc etc
  • Re: Creare più processi figli

    Va bene vedo che succede
  • Re: Creare più processi figli

    XD accade un macello
Devi accedere o registrarti per scrivere nel forum
30 risposte