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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#define NB 5
#define CLE 1234
int sem_create(key_t cle,int initval);
void P(int semid);
void V(int semid);
void sem_delete(int semid);
void creer_structures(int *nv,int *np,int *mutex);
void producteur1(int nv,int np,int mutex);
void producteur2(int nv,int np,int mutex);
void consommateur(int nv,int np,int mutex);
main()
{
int id1,id2;
int shmid,msqid,nv,np,mutex;
creer_structures(&nv,&np,&mutex);
id1=fork();
if(id1==0) producteur1(nv,np,mutex);
else {id2= fork();
if(id2==0) producteur2(nv,np,mutex);
else consommateur(nv,np,mutex);
}
}
void producteur1(nv,np,mutex)
{
int i;
union semun{
int val ;
struct semid_ds *buf ;
ushort array[1] ;
}arg ;
arg.val=1;
for(i=0;i<NB;i++){
printf("deposer1 numero %d \n",i+1);
printf("valeur du nv %d \n",semctl(nv,0,GETVAL,arg));
printf("valeur du np %d \n",semctl(np,0,GETVAL,arg));
//produire article i
puts("P(nv) producteur1");
P(nv);
puts("P(MUTEX) producteur1");
P(mutex);
// deposer
puts("V(MUTEX) producteur1");
V(mutex);
puts("V(np) producteur1");
V(np);
printf("valeur du nv %d \n",semctl(nv,0,GETVAL,arg));
printf("valeur du np %d \n",semctl(np,0,GETVAL,arg));
}
puts("FIN producteur1");
}
void producteur2(nv,np,mutex)
{
int i;
union semun{
int val ;
struct semid_ds *buf ;
ushort array[1] ;
}arg ;
arg.val=1;
for(i=0;i<NB;i++){
printf("\t\t\t\tdepos2 numero %d \n",i+1);
printf("\t\t\t\tvaleur du nv %d \n",semctl(nv,0,GETVAL,arg));
printf("\t\t\t\tvaleur du np %d \n",semctl(np,0,GETVAL,arg));
//produire article i
puts("\t\t\t\tP(nv) producteur2");
P(nv);
puts("\t\t\t\tp(mutex) producteur2");
P(mutex);
//deposer
puts("\t\t\t\tV(mutex) producteur2");
V(mutex);
puts("\t\t\t\tV(np) producteur2");
V(np);
printf("\t\t\t\tvaleur du nv %d \n",semctl(nv,0,GETVAL,arg));
printf("\t\t\t\tvaleur du np %d \n",semctl(np,0,GETVAL,arg));
}
puts("\t\t\t\tFIN producteur2");
}
void consommateur(nv,np,mutex)
{
int i;
union semun{
int val ;
struct semid_ds *buf ;
ushort array[1] ;
}arg ;
arg.val=1;
for(i=0;i<NB*2;i++){
printf("\t\t\t\t\t\t\tvaleur du nv %d \n",semctl(nv,0,GETVAL,arg));
printf("\t\t\t\t\t\t\tvaleur du np %d \n",semctl(np,0,GETVAL,arg));
puts("\t\t\t\t\t\t\tP(np) consommateur");
P(np);
//prelever
printf("\t\t\t\t\t\t\tprelever no %d\n",i);
puts("\t\t\t\t\t\t\tV(nv) consommateur");
V(nv);
printf("\t\t\t\t\t\t\tvaleur du nv %d \n",semctl(nv,0,GETVAL,arg));
printf("\t\t\t\t\t\t\tvaleur du np %d \n",semctl(np,0,GETVAL,arg));
//consommer article
}
puts("\t\t\t\t\t\t\tFIN");
wait(0);
sem_delete(nv);sem_delete(np);sem_delete(mutex);
}
int sem_create(key_t cle,int initval)
{int semid;
union semun{
int val;
struct semid_ds *buf;
ushort *array;
}arg_ctl;
semid = semget(cle,1,IPC_CREAT|0666);
if (semid == -1){
semid = semget(ftok("dijkstra.h",cle),1, 0666) ;
if (semid == -1){
puts("Erreur semget()") ;
exit(1) ;
}
}
arg_ctl.val = initval ;
if (semctl(semid,0,SETVAL,arg_ctl) == -1){
perror("Erreur initialisation semaphore") ;
exit(1) ;}
return(semid) ;
}
void P(int semid)
{
struct sembuf sempar ;
sempar.sem_num = 0 ;
sempar.sem_op = -1 ;
sempar.sem_flg = SEM_UNDO ;
if (semop(semid, &sempar, 1) == -1)
perror("Erreur operation P");
}
void V(int semid)
{
struct sembuf sempar ;
sempar.sem_num = 0 ;
sempar.sem_op = 1 ;
sempar.sem_flg = SEM_UNDO ;
if (semop(semid, &sempar, 1) == -1)
perror("Erreur operation V") ;
}
void sem_delete(int semid)
{
if (semctl(semid,0,IPC_RMID,0) == -1)
perror("Erreur dans destruction semaphore");
}
void creer_structures(int *nv,int *np,int *mutex)
{
//Sémaphores
*nv=sem_create(ftok("etudn",CLE),2);
*np=sem_create(ftok("etudf",CLE),0);
*mutex=sem_create(ftok("producteur1.dat",CLE),1);
} |
Partager