1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/types.h>
#include "types.h"
#include "lib.h"
#include "cle.h"
/* Mode de production de la nourriture a la commande */
void productionCommande(int shmid, int msgid)
{
int* nb_nourritures = (int*) shmat(shmid, 0, 0);
while(1)
{
printf("je produis 1 nourriture a la commande\n");
/* Les cuisiniers regardent le compteur */
if((*nb_nourritures) != 0)
{
nourriture_t nourriture;
time(&nourriture.date_creation);
sleep(TEMPS_PRODUCTION_NOURRITURE);
if(msgsnd(msgid, &nourriture, sizeof(nourriture_t), 0) == -1)
erreurFin("Erreur msgsnd : ", 1);
(*nb_nourritures)--;
}
else
{
printf("Jattendssss\n");
sleep(5);
}
}
}
/* Mode de production de la nourriture en continue */
void productionContinue(int msgid)
{
while(1)
{
printf("je produis 1 nourriture en continue\n");
nourriture_t nourriture;
time(&nourriture.date_creation);
sleep(TEMPS_PRODUCTION_NOURRITURE);
if(msgsnd(msgid, &nourriture, sizeof(nourriture_t), 0) == -1)
erreurFin("Erreur msgsnd : ", 1);
}
}
/* Interception du signal correspondant au mode de production a la commande */
void traitantSignalChefProdCommande(int num)
{
printf("°°° Nous, les cuisiniers, devons produire a la commande °°° \n");
/* Initilisation des outils de communications et recuperation des identifiants */
int idCommunications[7];
initCommunications(0,
0,
0,
0,
CLE_MEM_NOURRITURES_A_PRODUIRE,
CLE_FILE_NOURRITURES,
0,
(int*) &idCommunications);
productionCommande(idCommunications[4], idCommunications[5]);
}
/* Interception du signal correspondant au mode de production en continue */
void traitantSignalChefProdContinue(int num)
{
printf("°°° Nous, les cuisiniers, devons produire en continu °°° \n");
/* Initilisation des outils de communications et recuperation des identifiants */
int idCommunications[7];
initCommunications(0,
0,
0,
0,
0,
CLE_FILE_NOURRITURES,
0,
(int*) &idCommunications);
productionContinue(idCommunications[5]);
}
int main(int argc, char** argv)
{
int chef = atoi(argv[3]);
if(argc != 4)
erreurFin("Appel de cuisinier avec 3 arguments !", 1);
if(chef == TRUE)
{
signal(SIGUSR1, traitantSignalChefProdCommande);
signal(SIGUSR2, traitantSignalChefProdContinue);
printf("Je suis le chef des cuisiniers ! ");
}
/*else
{
printf("okkkkkkkkkkk");
signal(SIGUSR1, traitantSignalProdCommande);
signal(SIGUSR2, traitantSignalProdContinue);
}*/
printf("Je suis un cuisinier, pid : %d\n", (int) getpid());
/* Initilisation des outils de communications et recuperation des identifiants */
int idCommunications[7];
initCommunications(0,
0,
0,
0,
CLE_MEM_NOURRITURES_A_PRODUIRE,
CLE_FILE_NOURRITURES,
0,
(int*) &idCommunications);
productionCommande(idCommunications[4], idCommunications[5]);
} |
Partager