| 12
 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