Completato!

#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){
   char a[1],b[1];
   pid_t pid[2];
   if (argc < 3){
      perror("errore nel passaggio di parametri");
      exit(1);
   }
   int filedes[2],filedes2[2],fd,fd2,fd3,n,flag=0,i=0,j=0,letti=0,status;
   if((fd=open(argv[1],O_RDONLY))<0){
      perror("errore nell'apertura del file");
      exit(1);
   }
   if((fd3=open(argv[2],O_RDONLY))<0){
      perror("errore");
      exit(1);
   }
    if((fd2=open(argv[3],O_WRONLY))<0){
      perror("errore");
      exit(1);
   }
   if(pipe(filedes)<0){
      perror("errore della seconda pipe");
      exit(1);
   }
   if(pipe(filedes2)<0){
      perror("errore della seconda pipe");
      exit(1);
   }
   for(i=0;i<2;i++){
      pid[i]=fork();
      if(pid[i]<0){
         perror("errore di fork");
         exit(1);
      }
      else if(pid[i]==0){    
       if(i==0){
          while((n=read(fd,a,1))>0){
             if(write(STDOUT_FILENO,a,n)<0){
                perror("errore in lettura");
                close(fd);
                exit(1);
             }
             if(strcmp(a,argv[4])>0)
                flag=1;
             if(flag==1){
                if(write(filedes[1],a,1)<0){
                   perror("errore in scrittura");
                   close (fd);
                }
                letti++;
             }
           }
        }
        else{
          while((n=read(fd3,a,1))>0){
             if(write(STDOUT_FILENO,a,n)<0){
                perror("errore in lettura");
                close(fd);
                exit(1);
              }
              if(strcmp(a,argv[4])>0)
                flag=1;
              if(flag==1){
                if(write(filedes2[1],a,1)<0){
                   perror("errore in scrittura");
                   close (fd);
                }
                letti++;
              }
          }
       }
         flag=0;
         exit(0);
      }
      else if (pid[i]>0){
        wait (&status);
      /*
        if(waitpid(pid[i],&status)<0){
        perror("errore di wait");
        exit(1);
      }
     */ 
      if(i==0){
         close(filedes[1]);
         while((n=read(filedes[0],a,1))>0){
            if(write(fd2,a,n)<0){
               perror("errore in lettura");
               exit(1);
            }
         }
      }
      else{   
         close(filedes2[1]);
         while((n=read(filedes2[0],b,1))>0){
            if(write(STDIN_FILENO,b,n)<0){
               perror("errore in lettura");
               exit(1);
            }
         }
      }
      }
  }
/*
  for(j=0;j<2;j++){
      wait(&status);
 */
  printf("FINE");
  exit(0);
  }