#include #include #include #include #include #include #include #include #define KEY 160 #define NB_ITERATION 100000 /* * TP2 Partie 3 Communication par mémoire partagée * On observe une alternance correct et derterministe. * Le débit calculé est cohérent */ void utilisation() { printf("Usage : ./a.out [c] [s]\n"); exit(-1); } int main(int argc, char *argv[]) { int server = -1; struct timeval begin, end; // Variables SHM int key_shm = KEY; int *shm = NULL; int shmid = 0; // Variables IPC int key = KEY; int init_s = 0; int init_c = 1; char recv[1]; struct sembuf op; int sem_s, sem_c; /* Traitement des arguments */ if (argc != 2) { utilisation(); } if (*argv[1] == 's') { server = 1; sem_s = semget((key_t)key, 1, 666 | IPC_CREAT); sem_c = semget((key_t)key+1, 1, 666 | IPC_CREAT); } else if (*argv[1] == 'c') { sem_s = semget((key_t)key, 0, 0); sem_c = semget((key_t)key+1, 0, 0); server = 0; } else { utilisation(); } /* Création du sémaphore */ if (sem_s < 0 || sem_c < 0) { printf("Erreur création sémaphore.\n"); exit(-1); } /* Initialisation du sémaphore */ if (server) { if (semctl(sem_s, 0, SETVAL, init_s) == -1 || semctl(sem_c, 0, SETVAL, init_c) == -1) { printf("Erreur initialisation sémaphore.\n"); exit(-1); } } op.sem_num = 0; op.sem_flg = 0; /* Création de la SHM */ if (!(shmid = shmget((key_t)key_shm, 4, 0666 | IPC_CREAT))) { printf("Erreur création SHM.\n"); exit(-1); } /* Attachement de la shm */ if (!(shm = (int *)shmat(shmid, 0, 0))) { printf("Erreur attache SHM.\n"); exit(-1); } ////////SERVER//////// if (server) { printf("Mode serveur.\n"); for (int i = 0; i < (NB_ITERATION/2); ++i) { op.sem_op = -1; //printf("Serveur en attente...\n"); if (semop(sem_s, &op, 1)) { printf("Erreur attente.\n"); exit(-1); } //printf("On incrémente le shm..."); (*shm)++; //printf("Fait.\n"); //sleep(1); op.sem_op = 1; //printf("Le serveur rend la main.\n"); if (semop(sem_c, &op, 1)) { printf("Erreur op.\n"); exit(-1); } } } ////////CLIENT//////// else { printf("Mode client.\n"); printf("Lancement du chronometre.\n"); gettimeofday(&begin, NULL); for (int i = 0; i < (NB_ITERATION/2); ++i) { op.sem_op = -1; //printf("Client en attente...\n"); if (semop(sem_c, &op, 1)) { printf("Erreur attente.\n"); exit(-1); } //printf("On incrémente le shm..."); (*shm)++; //printf("Fait.\n"); //sleep(1); //printf("Le client rend la main.\n"); op.sem_op = 1; if (semop(sem_s, &op, 1)) { printf("Erreur op.\n"); exit(-1); } } gettimeofday(&end, NULL); op.sem_op = -1; if (semop(sem_c, &op, 1)) { printf("Erreur attente.\n"); exit(-1); } } printf("Valeur finale SHM : %d\n", *shm); /* detache la SHM */ if (shmdt(shm)) { printf("Erreur détachement.\n"); exit(-1); } if (!server) { /* Destruction SHM */ if (shmctl(shmid, IPC_RMID, 0)) { printf("Erreur destruction SHM.\n"); exit(-1); } /* Libération sémaphore */ if (semctl(sem_s, 0, IPC_RMID, 0) || semctl(sem_c, 0, IPC_RMID, 0)) { printf("Erreur libération sémaphore.\n"); exit(-1); } /* Calcul débit*/ int delta = ((end.tv_sec - begin.tv_sec) * 1000000L + end.tv_usec) - begin.tv_usec; int debit = (NB_ITERATION * 2 * sizeof(int) * 8) / (delta); // (delta est déjà en us) printf("Débit calculé : %d Mb/s\n", debit); } printf("Fin.\n"); return 0; } /* if (server) { printf("Affectation de la valeur par le serveur.\n"); *shm = 10; sleep(10); printf("Nouvelle valeur lue par le serveur : %d\n", *shm); } else { printf("Valeur lue par le client : %d\n", *shm); *shm = 28; printf("Valeur modifiée par le client : %d\n", *shm); } */