#include #include #include #include #include #include #include #define KEY 30 /* * TP 2 partie sémaphore OK. * L'exclusion mutuelle est observée correctement. * Lancez d'abord le serveur puis le client. * Si echec, essayez de changer la clé. */ void utilisation() { printf("Usage : ./a.out [c] [s]\n"); exit(-1); } void server() { int key = KEY; int init = 1; char recv[1]; struct sembuf op; int sem = semget((key_t)key, 1, 666 | IPC_CREAT); if (sem < 0) { printf("Erreur création sémaphore.\n"); exit(-1); } if (semctl(sem, 0, SETVAL, init) == -1) { printf("Erreur initialisation sémaphore.\n"); exit(-1); } op.sem_num = 0; op.sem_flg = 0; while (1) { op.sem_op = -1; printf("Serveur en attente...\n"); if (semop(sem, &op, 1)) { printf("Erreur attente.\n"); exit(-1); } printf("Le serveur a la main. Entrez qqc : "); fgets(recv, 10, stdin); op.sem_op = 1; printf("Le serveur rend la main.\n"); if (semop(sem, &op, 1)) { printf("Erreur op.\n"); exit(-1); } } } void client() { int key = KEY; int init = 0; char recv[1]; struct sembuf op; int sem = semget((key_t)key, 0, 0); if (sem < 0) { printf("Erreur création sémaphore.\n"); exit(-1); } op.sem_num = 0; op.sem_flg = 0; while (1) { op.sem_op = -1; printf("Client en attente...\n"); if (semop(sem, &op, 1)) { printf("Erreur attente.\n"); exit(-1); } printf("Le client a la main. Entrez qqc : "); fgets(recv, 10, stdin); op.sem_op = 1; printf("Le client rend la main.\n"); if (semop(sem, &op, 1)) { printf("Erreur op.\n"); exit(-1); } } } int main(int argc, char **argv) { // Arguments parsing if (argc != 2) { utilisation(); } if (*argv[1] == 's') { server(); } else if (*argv[1] == 'c') { client(); } else { utilisation(); } }