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
| #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <string.h>
#include <pthread.h>
#define NB_CLE 17
#define NB_VOITURE 50
typedef struct cars voiture_t;
struct cars {
int current_queue;
int prio;
int dest;
pthread_t thread_voiture;
};
void erreurFin(const char* msg);
void clean_queue();
void init_voiture();
static void * fn_voiture(void * p_data);
static int get_random (int max);
int i;
int j = 1;
key_t cle[NB_CLE];
int msgid[NB_CLE];
int main (int argc, char *argv[]) {
j++;
printf("\n%d\n", j);
/*Fil de message*/
for (i=0; i<NB_CLE; i++) {
if ((cle[i] = ftok(argv[0],i)) == -1) {
erreurFin("Impossible de créer la cle");
}
/*printf("i : %d\ncle[%d] : %d\n", i, i, cle[i]);*/
if ((msgid[i] = msgget(cle[i],IPC_CREAT | IPC_EXCL | 0600)) == -1) {
erreurFin("Impossible de créer la file de message");
}
}
for (i=0; i<NB_CLE; i++) {
printf("cle : %d\tid : %d\n", (int) cle[i], msgid[i]);
}
init_voiture();
/*FIN CORPS*/
/*Nettoyage*/
clean_queue();
return 0;
}
/********************************************************************
* Fonctions globales *
********************************************************************/
void erreurFin(const char* msg) {
perror(msg);
exit(1);
}
void clean_queue() {
for (i=0; i<NB_CLE; i++) {
if ((msgctl(msgid[i],IPC_RMID,NULL)) == -1) {
printf("i : %d\nmsgid[%d] : %d\n", i, i, msgid[i]);
erreurFin("Impossible de supprimer la file");
}
}
}
static int get_random (int max)
{
double val;
val = (double) max * rand ();
val = val / (RAND_MAX + 1.0);
return ((int) val);
}
/********************************************************************
* Fonctions gestion voiture *
********************************************************************/
void init_voiture() {
voiture_t tab_voiture[NB_VOITURE];
switch(fork()) {
case -1:
erreurFin("Impossible de créer le processus voiture");
break;
case 0:
printf("\n\t\tCeci ne doit etre lu qu'une fois\n");
for (i=0 ; i<NB_VOITURE ; i++) {
printf("Création de la voiture %d\n", i);
if ((pthread_create(&tab_voiture[i].thread_voiture,NULL, fn_voiture, (void *) i)) != 0) {
erreurFin("Impossible de créer une voiture");
}
}
printf("\n\tCeci ne doit etre lu qu'une fois\n");
for (i=0 ; i<NB_VOITURE ; i++) {
pthread_join(tab_voiture[i].thread_voiture,NULL);
}
break;
default :
usleep(0);
}
}
static void * fn_voiture(void * p_data) {
int nb = (int) p_data;
int entree = get_random (8);
int sortie = get_random (8);
FILE* fichier = NULL;
char fi[2];
sprintf(fi, "%d", nb);
while (sortie == entree)
sortie = get_random (8);
fichier = fopen(fi, "a+");
if (fichier != NULL) {
fprintf(fichier, "Je suis la voiture %d\n\tentree = %d\n\tsortie = %d\n", nb, entree, sortie);
fclose(fichier);
}
else /*printf("Je suis la voiture %d\n\tentree = %d\n\tsortie = %d\n", nb, entree, sortie);*/
printf("erreur");
pthread_exit(0);
} |
Partager