1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <errno.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define CLEF rand()%9999 // je définis une clef au hasard
#define IFLAGS (SEMPERM | IPC_CREAT)
#define SKEY (key_t) IPC_PRIVATE
#define SEMPERM 0600
typedef struct{
int NbCabinesOccupeesE;
int NbPaniersOccupesE;
int NbAbonnesAttenteE;
}structure_partagee;
int semid ;
int mem_ID;
struct sembuf sem_oper_P ; /* Operation P */
struct sembuf sem_oper_V ; /* Operation V */
void P(int semnum) {
sem_oper_P.sem_num = semnum;
sem_oper_P.sem_op = 0 ;
sem_oper_P.sem_flg = 0 ;
semop(semid,&sem_oper_P,1);
}
void V(int semnum) {
sem_oper_V.sem_num = semnum;
sem_oper_V.sem_op = 1;
sem_oper_V.sem_flg = 0 ;
semop(semid,&sem_oper_V,1);
}
int initsem(key_t semkey) {
int status = 0;
int semid_init;
union semnun {
int val;
struct semid_ds *stat;
ushort * array;
}ctl_arg;
/*Création du tableau de sémaphore*/
if ((semid_init = semget(semkey, 3, IFLAGS)) > 0) {
/*Initialisation des valeurs sémaphores */
ushort array[3] = {1, 1, 0};
ctl_arg.array = array;
status = semctl(semid_init, 0, SETALL, ctl_arg);
}
if (semid_init == -1 || status == -1) {
perror("Erreur initsem");
return (-1);
}else{
return (semid_init);
}
}
void memoire(){
int i = 0;
structure_partagee Data;
void* segment_partagee;
mem_ID = shmget(CLEF, sizeof(Data), IPC_CREAT | IPC_EXCL | SHM_R | SHM_W );
if (mem_ID < 0){
perror("shmget");
exit(1);
}
segment_partagee = shmat(mem_ID, NULL, 0);
if (segment_partagee < 0 ){
perror("shmat");
exit(1);
}
Data.NbCabinesOccupeesE = 0;
Data.NbPaniersOccupesE = 24;
Data.NbAbonnesAttenteE = 0;
*((structure_partagee*)segment_partagee) = Data;
printf("memoire créé\n");
P(3);
void detruitSegment(int shmid) {
if (shmctl(shmid,IPC_RMID,NULL) == -1){
perror("Erreur lors de la destruction") ;
exit(1) ;
}
}
detruitSegment(mem_ID);
printf("fin\n");
}
void piscine(){
int N = 25, C = 10;
int cout = 0;
int NbCabinesOccupees;
int NbPaniersOccupes;
int NbAbonnesAttente;
void* segment_partagee;
segment_partagee = shmat(mem_ID, NULL, 0);
structure_partagee Data = *((structure_partagee*)segment_partagee);
if (segment_partagee < 0 ){
perror("shmat");
exit(1);
}else{
printf("shmat: succes\n");
}
NbCabinesOccupees = Data.NbPaniersOccupesE;
printf("Nombre de cabine %d\n",NbCabinesOccupees );
}
void main (){
semid = initsem(SKEY);
pid_t pid;
pid = fork();
switch(pid){
case -1:
printf("Erreur fork");
exit(0);
break;
case 0:
memoire();
break;
default:
sleep(5);
piscine();
break;
}
exit(0);
} |
Partager