logo

Général

Accueil

Présentation section

Matériel section

Trombinoscopes

Liens

Plan du site

Contactez-nous

SN 1

Aide spécifique Java

TP C++ Arduino

Les TP réseau Linux

Les TD Java

Les TP Java

TD C#

TP C#

Les Mini-projets

Stage en entreprise

IRIS 2

TP IPC linux / coldFire

TP PHP

Cours / TP XML

Projets

Cours

SN 1

IRIS 2

Statistiques

1 visiteur

Record : 92

Pages vues :

Aujourd'hui : 78

Total : 187251

Valid XHTML 1.0 Transitional

Exemple Sémaphore C

separation

[Vous êtes ici ] ==> Accueil > IRIS 2 > TP IPC linux / coldFire > Exemple Sémaphore

separation

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); } }

separation

ancre