/* * Programme de simulation de "Pirates" * "Pirates" pose un problème de type Lecteur/rédacteur avec un besoin de * priorités égales entre le rédacteur et les lecteurs, Barbe-Noire étant * le rédacteur, ses lieutenants étant des lecteurs. */ #include #include #include #include #include #include #include #include /* * Définition des clés pour les ipc (de maniere à toujours prendre les memes * et s'eviter des ipcrm pendant la phase de test) */ /* Pour la mémoire partagée */ #define SHMKEY1 31 /* Pour les sémaphores, prendre 40, 41, ... */ #define SEMKEY1 41 #define SEMKEY2 42 #define SEMKEY3 43 /* * Definition des pirates */ typedef struct { char nom[32];/* Nom du pirate */ int nbFois; /* Nb fois que le pirate a son comportement */ int ta; /* Valeur du temps t indice a */ int tc; /* Valeur du temps t indice c */ } pirate_t; /* Barbe-Noire */ pirate_t barbeNoire = {"Barbe-Noire", 10, 5, 3}; /* Lieutenants */ #define NBLIEUTENANT 3 pirate_t lieutenant[NBLIEUTENANT] = { {"Le Borgne" , 10, 1, 1}, {"Long Jean d'Argent", 10, 2, 2}, {"Rackham le Rose" , 10, 4, 4} }; /* * Variables liées au paradigme lecteur/rédacteur (les noms sont repris * du cours). */ /* Compteur du nombre de lecteurs */ int *nl; /* Les différents sémaphores */ int mutexG; int mutexL; int fifo; /* * Fonction d'allocation d'un sémaphore de clé key et de valeur * initiale initVal */ int semAlloc(int key, int initVal){ int semId; semId = semget(key, 1, IPC_CREAT|0600); if (semId == -1) { perror("semget"); exit(2); } if (semctl(semId, 0, SETVAL, initVal) == -1) { perror("semctl"); exit(2); } return semId; } /* * Procédures P et V pour manipulation du sémaphore de rang 0 des objets * sémaphores */ void P(int semId){ struct sembuf aBuf = {0, -1, 0}; if (semop(semId, &aBuf, 1) == -1){ perror("semop P"); exit(2); } } void V(int semId){ struct sembuf aBuf = {0, +1, 0}; if (semop(semId, &aBuf, 1) == -1){ perror("semop V"); exit(2); } } /* * Procédure de simultation du comportement du lieutenant numéro num */ void lieut(int num){ int i; for (i=0 ; i on prend le */ /* rôle de Barbe-Noire */ barbe(); /* Barbe-Noire attend que tous ses lieutenants soient morts avant de */ /* mourir */ for (i=0 ; i