Exemple Sémaphore C


Analyse : Producteur/consommateur
Fichier Client.c
|
Fichier serveur.c
|
SEMACLIENT init à 0
P (SEMACLIENT)
……………….
V (SEMASERVEUR)
|
SEMASERVEUR init à 1
P (SEMASERVEUR)
……………………
V (SEMACLIENT)
|
Deux fichiers sont mis en œuvre un serveur et un client. Ils communiquent par une mémoire partagée synchronisée par sémaphores
Attention, pour une question de lisibilité, aucune gestion d'erreur
Exported from Notepad++
/* Fichier Serveur.c */
#include ‹stdio.h>
#include ‹sys/ipc.h>
#include ‹sys/sem.h>
#include ‹sys/shm.h>
#include ‹sys/types.h>
#include ‹sys/file.h>
#define SEMASERVEUR 0 /* Nom du sémaphore serveur */
#define INITSERVEUR 1 /* Valeur d'init du sémaphore serveur */
#define SEMACLIENT 1 /* Nom du sémaphore client */
#define INITCLIENT 0 /* Valeur d'init du sémaphore client */
#define CLESEMAPHORE "/tmp/SEMAP"/* Les fichiers SEMAP et MEMOP doivent */
#define CLEMEMOIRE "/tmp/MEMOP" /* exister (créés par touch */
#define OPTION 'a'
#define NBSEMAPHORE 2
#define DROIT 0666
#define TAILLEMEMOIRE 80
#define P –1 /* Prendre */
#define V 1 /* vendre */
void semaphore(int idSemaphore,int typeSemaphore,int operation);
int main()
{ key_t cleSemaphore,cleMemoire;
int idSemaphore,idMemoire;
char * debutMemoire,* vecteurMemoire;
int * entier;
char tampon[]="Contenu zone memoire";
/**********Creation semaphore**************************/
cleSemaphore=ftok(CLESEMAPHORE,OPTION);
idSemaphore=semget(cleSemaphore,NBSEMAPHORE,DROIT|IPC_CREAT);
/* Initialisation Semaphore */
semctl(idSemaphore,SEMASERVEUR,SETVAL,INITSERVEUR);
semctl(idSemaphore,SEMACLIENT,SETVAL,INITCLIENT);
/**********Creation memoire partagee**************************/
cleMemoire=ftok(CLEMEMOIRE,OPTION)
idMemoire=shmget(cleMemoire,TAILLEMEMOIRE,DROIT|IPC_CREAT)
debutMemoire=shmat(idMemoire,(char *)NULL,0);
/* Début d'utilisation */
vecteurMemoire=debutMemoire;
while(1)
{ semaphore(idSemaphore,SEMASERVEUR,P); /* Prend Serveur*/
printf("ServeurnDebut = %xn",debutMemoire);
(char *)entier=vecteurMemoire;
*entier=getpid();
printf("Serveur Valeur pid = %dn",*entier);
vecteurMemoire+=sizeof(int);
strcpy(vecteurMemoire,tampon);
printf("Serveur Finn");
semaphore(idSemaphore,SEMACLIENT,V); /* Vend client */
}
}
/* Fonction simplifiant Prendre et Vendre (voir utilisation) */
void semaphore(int idSemaphore,int typeSemaphore,int operation)
{ struct sembuf sema;
sema.sem_op=operation; /* Prendre ou vendre */
sema.sem_num=typeSemaphore; /* Numéro dans le tableau de sémaphore */
sema.sem_flg=0;
semop(idSemaphore,&sema,1); /* Opération sur le sémaphore */
}
/* Fichier Client.c Reprendre les constantes et la fonction semaphore */
#include ‹stdio.h>
#include ‹sys/ipc.h>
#include ‹sys/sem.h>
#include ‹sys/shm.h>
int main()
{ key_t cleSemaphore,cleMemoire;
int idSemaphore,idMemoire;
char * debutMemoire,* vecteurMemoire;
int * entier;
char tampon[]="Contenu zone memoire";
/**********Creation semaphore**************************/
cleSemaphore=ftok(CLESEMAPHORE,OPTION);
idSemaphore=semget(cleSemaphore,NBSEMAPHORE,DROIT|IPC_CREAT);
/**********Creation memoire partagee**************************/
cleMemoire=ftok(CLEMEMOIRE,OPTION);
idMemoire=shmget(cleMemoire,TAILLEMEMOIRE,DROIT|IPC_CREAT)
debutMemoire=shmat(idMemoire,(char *)NULL,0);
vecteurMemoire=debutMemoire;
while(1)
{ semaphore(idSemaphore,SEMACLIENT,P);
printf("ClientnDebut = %xn",debutMemoire);
(char *)entier=vecteurMemoire;
printf("Client Valeur pid serveur = %dn",*entier);
vecteurMemoire+=sizeof(int);
printf("Client contenu %sn Finn",vecteurMemoire);
getchar();
semaphore(idSemaphore,SEMASERVEUR,V);
}
}

