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