#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;
}

