Ciao a tutti,
in questi giorni sto svolgendo un esercizio sulla comunicazione tra processi con pipes, il cui testo è il seguente (scusate l'inglese):

Write a program which creates three child process P1, P2 and P3, and pipes between the processes.
Then P1 is to write a message to P2 who passes it to P3 who then passes it to P1, and so on.
Each time P1 receives the message he changes it.

Ho provato a svolgerlo in questo modo, ma mi dicono che è sbagliato.
Potreste darmi una mano? Grazie in anticipo!

codice:
#include <stdio.h>

int main()

{
    
  int fdes[2];     // prima pipe
  
  int fdes2[2];    // seconda pipe
  
  int fdes3[2];     // terza pipe

  int pid;            // usato per controllo nel fork
  
  int pid2;           // usato per controllo nel fork
  
  int pid3;         // usato per controllo nel fork

  char *messaggio = "sis" ;      // primo messaggio
  
  char *messaggio2 = "op";        // secondo messaggio

  int i=0;
  
  char singolo;         // singolo carattere
  
  char buffer1[5];    // buffer tra processi
  
  char buffer2[6];      // buffer tra processi
  
  char buffer3[7];       // buffer tra processi

  
  pipe(fdes);          // creazione prima pipe

  pipe(fdes2);        // creazione seconda pipe

  pipe(fdes3);       // creazione terza pipe




  pid=fork();           // processo A

  if(pid != 0)          // se è il padre
  
   { 
         
         wait();         //aspetto 
     
         close(fdes[1]);   // chiudo la pipe fdes in scrittura poichè prima devo leggere
     
          while (singolo !='\0') {     // fino a che non ho letto tutto il messaggio

		                singolo = read(fdes[0],1,sizeof(char)) ; // leggo ogni carattere

		                buffer1[i] = singolo;  // metto il carattere letto nel buffer

	                 	i = i + 1; // incremento il contatore per cambiare l 'indice del buffer

		                }
     
// ora che ho letto il mio messaggio apro la pipe in scrittura verso il secondo processo
     
     open(fdes[1]);  // pipe fdes aperta in scrittura. posso quindi passare il messaggio a B

     pid2=fork();   // processo B


     if(pid2 != 0)     // se è il padre
      { 
             wait();     //aspetto 
        
             close(fdes2[1]);   // chiudo la pipe fdes2 in scrittura poichè prima devo leggere


		        while (singolo !='\0') {    // fino a che non ho letto tutto il messaggio

		           singolo = read(fdes2[0],1,sizeof(char)) ; // leggo carattere per carattere

		                  buffer2[i] = singolo; 	// metto il carattere letto nel buffer

		                   i = i + 1; 	// incremento il contatore per cambiare l 'indice del buffer

		                  }

        open(fdes2[1]);  // pipe fdes2 aperta in scrittura. posso quindi passare il messaggio a C
        
	pid3=fork();    // processo C
	

	if(pid3 != 0)    // se è il padre
	 
     {
            
            wait();    //aspetto 
	 
      close (fdes3[1]);  // chiudo la pipe fdes3 in scrittura poichè prima devo leggere
	
		            while (singolo !='\0') {  // finchè non ho letto tutto il messaggio

		              singolo = read(fdes3[0],1,sizeof(char)) ;  // leggo ogni carattere

	                   	buffer3[i] = singolo; // metto il carattere letto nel buffer

		                  i = i + 1; // incremento il contatore per cambiare l 'indice del buffer

		                  }
  
  
          open(fdes3[1]);    // pipe fdes3 aperta in scrittura verso A

          *messaggio = *messaggio2; // cambio il messaggio	

	 }

        else // sono nel proc C
        
         { 
             
             write(fdes3[1],buffer2,sizeof(buffer2));	 
              
         }

      }

     else // sono nel processo B 
      
      {
          
           write(fdes2[1],buffer1,sizeof(buffer1));	  
           
      }
     
     
   }
  
  else //sono nel processo A
  
   {
       
       write(fdes[1],messaggio,sizeof(messaggio));	
         
   }

}