#include <stdio.h>
#include <unistd.h>
#define  NB_ENTIERS 5 

void fils(int p1[2], int p2[2])
{ int i, nombre, nb_lus ;
  
  close(p1[1]) ;   /* Fermeture du tube p1 en ecriture pour le fils. */
  close(p2[0]) ;   /* Fermeture du tube p2 en lecture pour le fils. */  
  nb_lus = read(p1[0],&nombre,sizeof(int)) ;  /* Lecture nombre sur p1. */
  while(nb_lus == sizeof(int)) 
  { nombre = nombre*2 ;                       /* Calcul du double. */
    printf("Les doubles sont :%d\n",nombre) ;
    write(p2[1],&nombre,sizeof(float)) ;      /* Ecriture double sur p2. */
    nb_lus = read(p1[0],&nombre,sizeof(int)) ;/* Lecture nombre sur p2. */
  }
  close(p1[0]) ;   /* Fermeture du tube p1 en ecriture pour le fils. */
  close(p2[1]) ;   /* Fermeture du tube p2 en lecture pour le fils. */
  exit(0) ;
}

int main()
{ int i, nombre,
      p1[2],       /* Descripteurs du tube p1. */
      p2[2] ;      /* Descripteurs du tube p2. */
  
  pipe(p1) ;       /* Creation du tube p1. */  
  pipe(p2) ;       /* Creation du tube p2. */  
  
  if (fork() == 0) /* Creation du fils. */
    fils(p1,p2) ;  /* Code du fils. */
  else
  { close(p1[0]) ; /* Fermeture du tube p1 en lecture pour le pere. */
    close(p2[1]) ; /* Fermeture du tube p2 en ecriture pour le pere. */    
    for (i=0;i<NB_ENTIERS ;i++) 
    { printf("Entrez un entier\n") ;     /* Demande d'un entier. */
      scanf(" %d",&nombre) ;             /* Saisie d'un entier. */
      write(p1[1],&nombre,sizeof(int)) ; /* Ecriture de l'entier sur p1. */
    }
    close(p1[1]) ; /* Fermeture du tube p1 en ecriture pour le pere. */    
    
    printf("Les doubles sont :\n") ;
    for (i=0;i<NB_ENTIERS ;i++) 
    { read(p2[0],&nombre,sizeof(int)) ;  /* Lecture d'un entier sur p2. */
      printf("%d ",nombre) ;             /* Affichage de l'entier. */
    }
    printf("\n") ; /* Important pour forcer l'affichage. */
    close(p2[0]) ; /* Fermeture du tube p2 en lecture pour le pere. */
  }
  return 0 ;
}

