rendered paste body#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
int OK=0;
int m1[2];
int m2[2];
pid_t livreur_pid[3];
void envoiM1(int s)
{
signal(SIGUSR1, envoiM1);
OK=1;
}
void envoiM2(int s)
{
signal(SIGUSR2, envoiM2);
OK=2;
}
void machine(int num)
{
int b, p, d;
/*orientation des tubes*/
if(close(m1[1])==-1)
{
perror("Erreur fermeture en ecriture tube m1\n");
exit(1);
}
if(close(m2[1])==-1)
{
perror("Erreur fermeture en ecriture tube m2\n");
exit(1);
}
/*on ferme le tube dans lequel on ne va pas lire*/
switch(num)
{
case 0:
if(close(m2[0])==-1)
{
perror("Erreur fermeture en lecture tube m2\n");
exit(1);
}
break;
case 1:
if(close(m1[0])==-1)
{
perror("Erreur fermeture en lecture tube m2\n");
exit(1);
}
break;
}
/*lecture de la boisson*/
switch(num)
{
case 0:
kill(livreur_pid[0], SIGUSR1);
if(read(m1[0], &b, sizeof(int))==-1)
{
perror("Erreur lecture boisson m1\n");
exit(3);
}
break;
case 1:
kill(livreur_pid[0], SIGUSR2);
if(read(m2[0], &b, sizeof(int))==-1)
{
perror("Erreur lecture reception boisson m2\n");
exit(3);
}
break;
}
/*lecture du plat*/
switch(num)
{
case 0:
kill(livreur_pid[1], SIGUSR1);
if(read(m1[0], &p, sizeof(int))==-1)
{
perror("Erreur lecture boisson m1\n");
exit(3);
}
break;
case 1:
kill(livreur_pid[1], SIGUSR2);
if(read(m2[0], &p, sizeof(int))==-1)
{
perror("Erreur lecture reception boisson m2\n");
exit(3);
}
break;
}
/*lecture du dessert*/
switch(num)
{
case 0:
kill(livreur_pid[2], SIGUSR1);
if(read(m1[0], &d, sizeof(int))==-1)
{
perror("Erreur lecture boisson m1\n");
exit(3);
}
break;
case 1:
kill(livreur_pid[2], SIGUSR2);
if(read(m2[0], &d, sizeof(int))==-1)
{
perror("Erreur lecture reception boisson m2\n");
exit(3);
}
break;
}
if(num==1)
printf("\t\t\t");
printf("Nouveau repas de la part de machine %d\n", num+1);
exit(0);
}
void livreur(int num)
{
int p=num;
signal(SIGUSR1, envoiM1);
signal(SIGUSR2, envoiM2);
if(close(m1[0])==-1)
{
perror("Erreur orientation ecriture tube m1\n");
exit(1);
}
if(close(m2[0])==-1)
{
perror("Erreur orientation ecriture tube m2\n");
exit(1);
}
if(!OK)
pause();
if(OK==1)
{
if(write(m1[1], &p, sizeof(int))==-1)
{
perror("Erreur ecriture tube m1\n");
exit(3);
}
}
else if(OK==2)
{
if(write(m2[1], &p, sizeof(int))==-1)
{
perror("Erreur ecriture tube m2\n");
exit(3);
}
}
OK=0;
exit(0);
}
int main(int argc, char *argv[])
{
int i;
if(pipe(m1)==-1)
{
perror("Erreur creation tube boisson\n");
exit(1);
}
if(pipe(m2)==-1)
{
perror("Erreur creation tube plat\n");
exit(1);
}
/*création des processus livreurs*/
for(i=0; i<3; i++)
{
switch((livreur_pid[i]=fork()))
{
case -1:
perror("Erreur creation processus livreur\n");
exit(2);
case 0:
livreur(i);
default : break;
}
}
/*création des processus machines*/
for(i=0; i<2; i++)
{
switch(fork())
{
case -1:
perror("Erreur creation processus machine\n");
exit(2);
case 0:
machine(i);
default : break;
}
}
return 0;
}