[HELP] NO PIPE NO CRY

di il
9 risposte

[HELP] NO PIPE NO CRY

Ciao a tutti!!!!!
ho un problema nel mio programma....e ormai sono un bel po di ore che cerco l-errore so che e' davanti ai miei occhi ma nn riesco a vederlo
Qualcuno riesci a darmi una mano?
Allora il programma non fa altro che creare due processi figli (P1 e P2) che devono comunicare
tra loro e con il padre mediante pipe!
qui sotto copio il pezzo di codice nel main che genera i due figli....

  for(i=0; i<N_FIGLI; i++)
   {
      pid = fork();
      if(pid == 0)
      {
         if(i==0) //corpo di P1
         {
           //chiudo il lato della pipe che P1 non usa chiudo scrittura
           close(pipe_p2_p1[1]); close(pipe_p1_p0[0]);

           figlio1(pipe_p2_p1[0], pipe_p1_p0[1], nomeFileIn );// leggo da P2, scrivo a P0
           exit(EXIT_SUCCESS);
         }//if i==0
         else if(i==1) // corpo P2
         {
           close(pipe_p2_p1[0]);// chiudo lettura
           close(pipe_p1_p0[0]);
           close(pipe_p1_p0[1]);//chiudo accesso pipe che nn usa P2

           figlio2(pipe_p2_p1[1], nomeFileIn); // scrivo a P1
           exit(EXIT_SUCCESS);
         }
 
      }
      else if( pid > 0) //padre
      {



      }
      else // pid < 0 errore
      {
         perror("Unable To Fork\n\n");
         exit(EXIT_FAILURE);

      }

 
   }//fine for


ho un file composto da triplette di numeri interi...a cui entrambi i processi figli devono accedere
ora p1 attende che venga scritto un intero sulla pipe_p2_p1 e
p2 ha il compito di leggere, a ogni ciclo, due numeri dal file (saltando poi con una fseek il 3 valore della tripletta), confrontarli e scrivere sulla pipe _p2_p1 il valore maggiore;
p1 a sua volta letto il valore massimo dalla pipe...deve confrontarlo con il terzo valore di ogni tripletta e se questo valore e' minore di quello letto dalla pipe allora p1 sovrascrivera' il terzo valore del file con quello letto dalla pipe ad ogni ciclo....
p1 inoltre invia il valore scelto a p0(il padre) che somma ad ogni ricezione i singoli valori letti...

qui di seguito le due funzioni chiamate rispettivamente da p1 e p2

void figlio1(int fromP2, int toP0, char *file_in)
{
  int  nwrite, nreadWhile, nreadC, fd, valueC, valueFromP2, nfseek, invio;

  fd = open(file_in, O_RDWR);
  
  if(fd <0)// controllo descrittore
  {
    perror("\nAttenzione il file non trovato ");
    close(toP0);
    close(fromP2);
    close(fd);
    exit(EXIT_FAILURE);
  }
  
  invio = 0;
  printf("\nAttendo P2.....");

  while( (nreadWhile =read(fromP2, &valueFromP2, sizeof(int))) > 0 )// sincronizzata con la write in P2 tramite pipe
  {
      printf("\nLeggo da P2");
      //devo confrontarlo con il valore C
      nfseek = fseek(fd, 2*sizeof(int), SEEK_CUR); // mi sposto di due posizioni cosi da leggere C
      if(nfseek != 0)// controllo fseek
      {
          perror("\nProblema con fseek in P1...");
          close(toP0);
          close(fromP2);
          close(fd);
          exit(EXIT_FAILURE);
      }
     
      nreadC = read(fd, &valueC, sizeof(int)); // leggo il terzo valore di ogni tripletta
      if(nreadC < 0)
      {
         perror("\nAttenzione  problemi lettura C value ");
         close(toP0);
         close(fromP2);
         close(fd);
         exit(EXIT_FAILURE);
      }

      if(valueFromP2 > valueC) // lo scrivo su file
      {
         invio = 1;
         nfseek = fseek(fd, -sizeof(int), SEEK_CUR); // mi riposiziono indietro per poter riscrivere il valore di C
         if(nfseek != 0)// controllo fseek
         {
          perror("\nProblema con fseek in P1...file");
          close(toP0);
          close(fromP2);
          close(fd);
          exit(EXIT_FAILURE);
         }
         
         nwrite = write(fd, &valueFromP2, sizeof(int));
         if(nwrite < 0)
         {
          perror("\nErrore scrittura in P2\n");
          close(toP0);
          close(fromP2);
          close(fd);
          exit(EXIT_FAILURE);
         }
         printf("\nValore di C : %d, Valore : %d.....aggiorno il file!!!\n", valueC, valueFromP2 );
      }
      if(invio) //spedisco valueFromP2
      {
         nwrite = write(toP0, &valueFromP2, sizeof(int));
         if(nwrite <0)
         {
          perror("\nErrore scrittura valueFromP2 \n");
          close(toP0);
          close(fromP2);
          close(fd);
          exit(EXIT_FAILURE);

         }
      }
      else  //spedisco valueC
      {
         nwrite = write(toP0, &valueC, sizeof(int));
         if(nwrite <0)
         {
          perror("\nErrore scrittura valueFromP2  sul file");
          close(toP0);
          close(fromP2);
          close(fd);
          exit(EXIT_FAILURE);
         }

      }

      
      
      
   invio = 0;
  }
  if( nreadWhile < 0)//gestione errore...
  {
    perror("\nErrore nella lettura del valore MAX in P1..\n");
    close(toP0);
    close(fromP2);
    close(fd);
    exit(EXIT_FAILURE);

  }
 
    printf("\nFine Comunicazione con P2....raggiunto EOF\n");
    close(toP0);
    close(fromP2);
    close(fd);
    exit(EXIT_SUCCESS);


}

void figlio2(int toP1, char *file_in) // legge due valori e il max lo scrive su pipe....sincronizzata con la read in P1
{
  int  nwrite, nfseek, max, fd, nread, read_buf[2];
  
  fd = open(file_in, O_RDONLY);

  if(fd < 0)
  {
    perror("\nAttentione file  non trovato\n");
    close(toP1);
    close(fd);
    exit(EXIT_FAILURE);
  }
  
  printf("\nLEGGO DAL FILE I VALORI.....P2");
  while( (nread = read(fd, read_buf, 2*sizeof(int))) > 0)
  {   
       printf("\nLETTI I VALORI : %d , %d....\n", read_buf[0], read_buf[1]);
       if(read_buf[0] >= read_buf[1]) /* A >= B */ 
       {
           max = read_buf[0];
           printf("\nIl valore scelto e A");
       } 
       else 
       {
            max = read_buf[1];
            printf("\nIl valore scelto e B");
       }
       printf("\nMAX in %d vale: %d...",getpid(), max);
       nwrite = write(toP1, &max, sizeof(int));
       if(nwrite < 0)
       {
          perror("Attenzione Problema con la write in P2\n");
          close(toP1); close(fd);
          exit(EXIT_FAILURE);
       }
     
      nfseek = fseek(fd, sizeof(int), SEEK_CUR); // salto la entry C
      if( nfseek != 0)
      {
      perror("Attenzione Problema con la fseek in P2\n");
      close(toP1); close(fd);
      exit(EXIT_FAILURE);
      } 
  printf("\n Rileggo nuovi valori...in P2 dal file...\n");
  }// while
  if(nread < 0)
  {
     close(fd);
     close(toP1);
     exit(EXIT_FAILURE);
  
  }
  
  printf("\nFine File Input Raggiunta\n.....");
  close(fd);
  close(toP1);//chiudendo l-estremo della pipe segnalo a P1 la fine
  exit(EXIT_SUCCESS);
}






mi da il seguente output:


LEGGO DAL FILE I VALORI.....P2
LETTI I VALORI : 15 , -18....

Il valore scelto e A
Attendo P2.....

VALORE SALVATO NEL FILE fileOut CORRETTAMENTE (SOMMA = 0)

cioe' p2 legge i due valori ma sembra non scriverli sulla pipe per p1...

Grazie Mille In Anticipo Per La risposta!!!!!!!!!

9 Risposte

  • Re: [HELP] NO PIPE NO CRY

    Ora sono su un cell e non vedo un tubo.
    nel fine settimana sono molto incasinato ma appena possibile lo guardo.
  • Re: [HELP] NO PIPE NO CRY

    Ciao Grazie Mille!!!...se serve ti posto tutto il codice poi^^
  • Re: [HELP] NO PIPE NO CRY

    p2 ha il compito di leggere, a ogni ciclo, due numeri dal file (saltando poi con una fseek il 3 valore della tripletta), confrontarli e scrivere sulla pipe _p2_p1 il valore maggiore;
    Non puoi usare fseek su una pipe.
  • Re: [HELP] NO PIPE NO CRY

    MmMMmmM spetta forse ho spiegato male! ....al main vengono passati un nome di un file da cui leggere gli interi e un nome di un file da creare e in cui salvare i valori che P0 legge su pipe;
    Ogni processo figlio ,P1 e P2, apre il file da cui leggere i valori e su quel file effettua la fseek!..non sulla pipe:P
  • Re: [HELP] NO PIPE NO CRY

    
     nfseek = fseek(fd, 2*sizeof(int), SEEK_CUR); // mi sposto di due posizioni cosi da leggere C
    
    Quello che mi ha tratto in errore é stato l'uso di fd nella fseek.
    Il problema é che quest'ultima non richiede un descrittore ma un ptr a FILE.
  • Re: [HELP] NO PIPE NO CRY

    Azz!! ecco perche' non andava ....Grazie per la disponibilita'!
    Senti gia' che ci sono ti faccio un altra domanda ....sto imparando ora ad utilizzare gdb per debuggare il codice e non mi e' chiaro come utilizzarlo nel caso di fork nel codice!
  • Re: [HELP] NO PIPE NO CRY

    sto imparando ora ad utilizzare gdb per debuggare il codice e non mi e' chiaro come utilizzarlo nel caso di fork nel codice!
    Quello che c'è da sapere è spiegato nel manuale del GDB:


    Se non ho sbagliato a capire, questa dovrebbe essere la sintesi:
    
    set follow-fork-mode  <parent || child>
       definisce se seguire il parent o il child.
       default: parent
    show follow-fork-mode
       mostra come è stato settato il comando
    
    set detach-on-fork <on || off>
       modalità  di controllo del GDB: solo il modalità definita sopra (on) o entrambe (off)
       default: on
       se off:
          inferiors
             mostra la lista delle fork eseguite
          inferior
             passa da un processo all' altro (switch)
    show detach-on-fork
       mostra come è stato settato il comando
    
    set follow-exec-mode mode <new || same>
       definisce se la exec deve essere 'rebindata' su un nuovo o sullo stesso inferior
    
  • Re: [HELP] NO PIPE NO CRY

    Perfetto !! Proprio quello che mi serviva :)!!!!
    Grazie Mille Per il Tuo Aiuto!!! e già che ci siamo Auguri di Buone Feste!
  • Re: [HELP] NO PIPE NO CRY

    Di niente.
    Buon Natale
Devi accedere o registrarti per scrivere nel forum
9 risposte