111 lines
No EOL
2 KiB
C
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();
|
|
}
|
|
} |