/** * Initialisation de l'anneau */ void init(char** argv) { printf("== Initialisation de l'anneau...\n"); // // Mémoire partagée printf("==== Création de la mémoire partagée\n"); printf("====== Création du segment\n"); if ((__shmid = shmget(ftok(argv[1], ANNEAU_SHM_KEY), ANNEAU_SHM_SIZE, IPC_CREAT | 0666)) == -1) { __raise(-3, "======== ERROR: Impossible de créer le segment partagé."); } // Attachement à une adresse choisie par le système if ((__anneau = shmat(__shmid, NULL, 0)) == (void *) -1) { __raise(-4, "======== ERROR: Attachement impossible"); } printf("====== Mémoire partagée %d créée\n", __shmid); // SIGINT signal (SIGINT, callback_sigint); // Création du sémaphore __semaphore = sem_open(SEM_NAME, O_CREAT, 0644, 1); printf("==[ Utilisez Ctrl+C stopper l'anneau ]==\n\n"); }
int ph_raise(uint_t pid, uint_t sig) { return __raise(pid, sig); }
int main(int argc, char *argv[]) { int cadence = ANNEAU_CADENCE_DEFAULT; // Cadence définit en millisecondes if (argc < 2) { __raise(-1, "Usage: %s <projet [, cadence]>", argv[0]); } // // Initialisation init(argv); // Cadence if (argc > 2) { cadence = atoi(argv[2]); } // Anneau int i; Anneau ano; ano.id = __pid; for (i = 0; i < ANNEAU_NUM_CASES; i++) { ano.cases[i].num = i; ano.cases[i].type = VIDE; ano.connexion[i] = 0; } *((Anneau *) __anneau) = ano; // // Démarrage printf("== Démarrage de l'anneau...\n"); printf("==== Cadence de rotation: %d ms/tour\n", cadence); // info(); // // Petite pause usleep(2000); // // Rotation int rotation = 1; while (1) { usleep(cadence * 1000); // Attente // La roue tourne d'un pas tourner(); printf("\tRotation %5d: \n", rotation++); info(); // Émission d'un signalS sonore pour informer les robots ding(); } __endProcess(); return 0; }
static void _sigwrap(struct msg *msg) { __raise(RP_PID(msg->source), msg->port); free(msg); }