Vous êtes sur la page 1sur 2

TP3- Les segments de mémoire partagée

Les segments de mémoire partagée:


Pour assurer un partage de données entre plusieurs processus, on peut utiliser les segments
de mémoire partagée :
1°- Création du segment : segid=shmget(cle, taille, option);
int segid; /* segid = -1 en cas d'echec */
key_t cle; int taille, option; /* le rôle de clé et option est le même que pour les
sémaphores */
Exemple : segid = shmget(1000, 512, IPC_CREAT|0666);

2°- Attachement du segment au processus : adrat = shmat(segid, adr, option);


char * adrat; /* Adresse d'attachement utilisée dans le programme pour accéder au
segment. adat = -1 en cas d'echec*/
char *adr; /* adresse virtuelle d'attachement ou 0 si le système doit la gérer */
int option, segid; /* droit d'accès au segment par le processus, ... (man shmat) */
Exemples :
1) adrat = shmat(segid, 0, 0); /* accès en lectureécriture */
2) adrt = shmat(segid, 0, SHM_RDONLY); /* accès en lecture seul */
3) adrt = shmat(segid, 2500, SHM_RND);
/* l'adresse virtuelle (2500) peut être arrondie afin de correspondre à une adresse
correcte */

3°- Lecture/Écriture dans le segment : On utilise l'adresse d'attachement.


Exemple : adt[0] ='S'; adt[1] ='D'; putchar(adt[0]);
Exemple complet :
#include<stdio.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>
main()
{ char *adr; int pid, id;
if((id=shmget(1000,512,IPC_CREAT|0666))==-1){ perror("Erreur shmget"); _exit(2);}

T.P Systèmes Opératoires/N.El Faddouli & Z.Bakkoury 1/2


1/2
pid=fork() ;
if (pid != 0)
{ if((adr = shmat(id,0,0))==(char *)-1) perror("Erreur shmat chez le père");
else { printf("Je suis le père, je vais déposer un message");
strcpy(adr,"salut, c'est ton père");
}
}
else {if((adr = shmat(id,0,0))==(char*)-1) perror("Erreur shmat chez le fils");
else {sleep(3); // imposer l'attente du fils jusqu'au remplissage du segment
printf("\n je suis le processus fils, mon père a écrit: %s",adr );
}
}
}

Exercice 1: Problèmes des 5 philosophes


Écrire un programme C qui représente une solution à ce problème en utilisant un segment
de mémoire partagée pour stocker le tableau Etat.
Écrire les fonctions suivantes:

A) Penser(i) : attente d'une durée aléatoire entre 2 et 4 secondes et l'affichage d'un


message contenant le N° du philosophe i.
B) Manger (i) : attente d'une durée aléatoire entre 2 et 4 secondes et l'affichage d'un
message contenant le N° du philosophe i.
C) PrendreFourchettes(i) : le philosophe n° i essaie de prendre ses deux fourchettes en
affichant un message adéquat.
D) Poser_Fourchettes(i) : le philosophe n° i rend les deux fourchettes en affichant un
message adéquat. Cette fonction fait appelle à Test(i) pour voir si le philosophe i peut
prendre les fourchettes ou non.

Exercice 2:
Utiliser un segment de mémoire partagée utilisé par des processus rédacteurs et lecteurs
dans les deux cas suivants :
E) Un rédacteur et un lecteur avec un tampon à une seule case.
F) Des rédacteurs et des lecteurs avec un tampon à N cases.

T.P Systèmes Opératoires/N.El Faddouli & Z.Bakkoury 2/2


2/2

Vous aimerez peut-être aussi