Ho provato a sviluppare questa applicazione tramite PIPE per esercitarmi:
Si vuole stampare a video una stringa di testo.
Prima della stampa, si intende censurarne il contenuto evitando di stampare un determinato carattere. Il comando deve far uso di 3 processi:
un processo padre (pubblicatore) e due processifigli (revisore e censore).
Il funzionamento del comando deve essere il seguente:
-Il pubblicatore crea i due figli, revisore e censore;
-Il revisore, una volta creato, comunica la stringa al censore;
-Il censore controlla la stringa ricevuta, eliminando il carattere prescelto, e la invia al pubblicatore;

Il pubblicatore, stampa su video la stringa censurata ricevuta.
La comunicazione tra processi avviene tramite PIPE senza nome.

codice:
#include  <fcntl.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
#include  <unistd.h>


int main(int argc, char *argv[]) {
   int pubblicatore[2],censore[2],revisore[2];
   int pid,ret,i,j,status;
   char buffer[10];    // buffer di scambio della stringa
   char temp[10];      // buffer temporaneo in cui si salva la stringa senza il carattere 'A'
   char c='a';        // carattere da eliminare dalla stringa
   char frase[] = "abcdef";   // stringa di partenza

   if((ret= pipe(pubblicatore))==-1) printf("Errore nella creazione della Pipe");
   
   pid=fork();

   // Nel Padre 

   if(pid>0){
      censore[0] = pubblicatore[0];
      censore[1] = pubblicatore[1];
      if((ret= pipe(pubblicatore))==-1) printf("Errore nella creazione della Pipe");
      pid=fork();
      if(pid>0){
         revisore[0]=pubblicatore[0];
         revisore[1]=pubblicatore[1];
      }else{
         //sono nel processo figlio REVISORE
         
         printf("Nel Revisore: %s\n",frase);
         // invio la stringa frase al figlio censore
         write(censore[1],&frase,sizeof(frase));
         close(censore[1]);
      }
   }else{
        // sono nel processo figlio CENSORE
      
        read(revisore[0],&buffer,sizeof(buffer));
        printf("Nel CENSORE: %s\n",buffer);
        // elimino il carattere 'A' da FRASE contenuto in BUFFER e salvo la nuova stringa in TEMP
        for(i,j=0; i<strlen(buffer);i++){
         if(buffer[i]!= 'a'){ 
            temp[j]=buffer[i];
            j++;
         }
      }
      printf("Nel CENSORE (stringa temp): %s\n",temp);
      // invio la nuova stringa censurata al padre
      write(pubblicatore[1],&temp,sizeof(temp));
      close(pubblicatore[1]);
      close(revisore[0]);
   }
   if(pid>0){
   wait(&status);
   wait(&status);
   read(censore[0],&buffer,sizeof(buffer));
   printf("Stringa Censurata: %s\n",&buffer);
   close(censore[0]);
   }
}
Non capisco il perchè, ma la stringa non si riesce a comunicare tra i processi!
Ho provato facendo debug tramite la classica printf();