/*---------Exo sur le pipe() et utilisation de fork()--------
Commutation de message 3 fils(+le pere qui est a la
fois Emetteur Recepteur du message);
Creation d'un circuit virtuel pour toute la duree de connexion
                  IUP GMI 
----------Presentation Koffi FOLIKPO-AWUTE-----------------*/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<string.h>
#include <errno.h>
#include<sys/time.h>

void ActionFils(int , int );
int msg;
int p[6][2];

int main(void)
{
  int pid[3],j,k=0;
  int i, msg0=3;
  srand(time(NULL));
  for(i=0;i<6;i++)
    {
    if(pipe(p[i])<0)
      {
      perror("pipe mal utilise");
      exit(1);
      }
    }
 
  write(p[0][1], &msg0, sizeof(int));
  printf("je suis le Pere %d : Envoie de message initial: %d\n",getpid(),msg0);
  printf("Chemin virtuel choisi:\n");
  while(k<3)
    {
      j=rand()%3;
      printf("Fils %d \n",j+1);
      pid[j]=fork();/* creation de process fils */

      switch(pid[j])
    {
    case -1 :/* erreur */
    perror("erreur fork()");
      break;
      case 0 :/* process fils */
    printf("je suis le fils %d, ",getpid());
      if(j==0)
    ActionFils(0, 3);
      else if(j==1)
    ActionFils(3, 4);
      else
    ActionFils(4, 2);
      defaullt :/*process pere*/
    break;
    }
      k++;
    }
if(getpid())
{
read(p[2][0], &msg, sizeof(int));
printf("Moi le pere %d    ,je recois en retour: %d\n",getpid(),msg);
}
sleep(1);
return 0;
}
/*Pour les fils lire,ecrire et afficher*/
void ActionFils(int l, int w)
{
read(p[l][0], &msg, sizeof(int));
printf("j'ai recu le message: %d\n",msg);
msg*=2;
printf("j'envoie  le message: %d\n",msg);
write(p[w][1], &msg, sizeof(int));
exit(0);
}