#include #include #include #include #include #define CLE 253 #define CLES 300 int main() { int shmid,semid; char *mem; int varlocale; struct sembuf operation; /* recuperation du segment de memoire partagee avec la cle CLE */ shmid=shmget((key_t)CLE,1000,0); /* attachement*/ mem=shmat(shmid,NULL,0); /* recuperation du tableau de semaphores*/ semid= semget((key_t)CLES,2,0); /* operation P(MUTEX) (semaphore MUTEX est le deuxieme element du tableau */ operation.sem_num= 1; operation.sem_op = -1; operation.sem_flg= 0; semop(semid, &operation, 1); /* increment et test de NL */ *mem= *mem+ 1; if (*mem== 1) { /* P(ACCES) */ /* operation P (ACCES)*/ operation.sem_num= 0; operation.sem_op= -1; operation.sem_flg= 0; semop(semid, &operation, 1); } /* operation V(MUTEX) (semaphore MUTEX est le deuxieme element du tableau */ operation.sem_num= 1; operation.sem_op = 1; operation.sem_flg= 0; semop(semid, &operation, 1); /* lecture dans le segment */ varlocale= *(mem+4); printf ("lecteur:"); printf ("valeur mem %d ",*mem); printf ("valeur memoire %d \n", varlocale); //printf ("lecteur, valeur memoire %d \n", varlocale); /* operation P(MUTEX) (semaphore MUTEX est le deuxieme element du tableau */ operation.sem_num= 1; operation.sem_op = -1; operation.sem_flg= 0; semop(semid, &operation, 1); /* decrementet test de NL */ *mem= *mem-1; if (*mem== 0) { /* V(ACCES) */ /* operationV (ACCES)*/ operation.sem_num= 0; operation.sem_op= 1; operation.sem_flg= 0; semop(semid, &operation, 1);} /* operation V(MUTEX) (semaphore MUTEX est le deuxieme element du tableau */ operation.sem_num= 1; operation.sem_op = 1; operation.sem_flg= 0; semop(semid, &operation, 1); return 0; }