logo

Général

Accueil

Présentation section

Matériel section

Trombinoscopes

Liens

Plan du site

Contactez-nous

CIEL 1

Langage C

Langage C++

Langage C#

Linux sur Raspberry

TP Arduino

UML/SysML

Mini-projets

Math

CIEL 2

UML

Rasberry

Système Num. 1

TP C Visual Studio

TP C++ Arduino

Aide spécifique Java

TP C/C++ MyRIO

TP Darwin-Op

Les TP réseau Linux

Les TD Java

Les TP Java

TD C#

TP C#

Les Mini-projets

Vidéo Mini-Projet

Stage en entreprise

Système Num. 2

TP C++/C#

RaspBerry

Projets

IRIS 2

TP IPC linux / coldFire

TP PHP

Cours / TP XML

Projets

S SI

1er S SI

1er SSI mini projet

1er S SI Liens

STI2D

SysML

Terminale SIN

Projet SIN

1er ETT

Projet 1er ETT

Terminale ETT

Questions BAC ETT

AP

Serfa

UML

C++

Statistiques

1 visiteur

Record : 207

Pages vues :

Aujourd'hui : 188

Total : 216801

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