La mémoire partagée (« shared memory ») permet, comme son
nom l'indique, de partager des données entre processus. Elle est surtout
utile lorsque 2 processus, issus d'un « fork() » par exemple, veulent
partager des données. En effet, vous devez vous rappeler que le « fork() »
crée 2 processus clones avec des segments de mémoire propres à chacun (pas
d'échange possible). Lorsque l'on utilise des threads c'est un peu moins
utile puisque ceux-ci partagent par défaut les variables globales d'un
programme. De nombreuses applications utilisent la mémoire partagée, la
première étant évidemment le système d'exploitation, qui partage des
segments de code ou de données entre plusieurs fonctions.
int shmget(key_t, int, int)
.
Où le premier paramètre est un nombre qui permettra aux processus de
déclarer une zone commune (ils auront la même clé). Le deuxième
paramètre est la taille demandée en octets de la mémoire partagée.
Le dernier paramètre spécifie la création du segment, en lecture,
écriture pour l'utilisateur, le groupe, les autres. La valeur de
retour est l'identifiant de la zone mémoire partagée.void* shmat(int, NULL, int)
. Où le « void *
» de retour est le pointeur local qui désignera l'espace partagé. Le
premier entier est l'identifiant de mémoire partagée et le dernier
entier des options (lecture seule ou lecture/écriture).shmdt(void
*)
. Le « void *
» est le pointeur local sur
l'espace partagé obtenu par shmat
.shmctl(int,
IPC_RMID,
struct...)
. Où l'entier du premier
paramètre est l'identifiant d'espace mémoire partagé obtenu lors du
shmget()
.shmctl(int, IPC_STAT, struct shmid_ds)
. La
structure regroupe plusieurs variables. D'après le manuel (« man
shmctl
»), la structure contient :struct shmid_ds {
struct ipc_perm shm_perm; /* Propriétaire et
permissions */
int shm_segsz; /* Taille segment en
octets */
time_t shm_atime; /* Heure dernier
attachement */
time_t shm_dtime; /* Heure dernier
détachement */
time_t shm_ctime; /* Heure dernier
changement */
unsigned short shm_cpid; /* PID du
créateur */
unsigned short shm_lpid; /* PID du dernier
shmat(2)/shmdt(2) */
short shm_nattch; /* Nombre
d’attachements */
};
struct ipc_perm
,
qui contient les permissions sur le segment partagé (cf. man).