cours_prog_systeme/TP/TP2/main.c
2021-08-22 13:28:10 +02:00

111 lines
No EOL
2 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#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();
}
}