7 – COMMUNICATION INTER PROCESSUS SEGMENTS DE MÉMOIRE PARTAGEE UNIX AVANCE 7 – COMMUNICATION INTER PROCESSUS SEGMENTS DE MÉMOIRE PARTAGEE Yves PAGNOTTE – Janvier 2011
OUTILS DE COMMUNICATION INTER PROCESSUS (IPC) sémaphores tubes files de messages segments de mémoire partagée
SEGMENT DE MEMOIRE PARTAGEE - c’est le concept de variable globale à plusieurs processus : zone d’octets consécutifs en mémoire - identifié dans UNIX par un identificateur entier - tout processus qui connaît l’existence d ’un segment de mémoire partagée peut réaliser des opérations sur celle-ci - un segment de mémoire partagée : pas seulement accessible à la descendance du processus qui crée la file, mais à tout processus dans le cadre des droits d’accès
OPERATIONS SUR UN SEGMENT DE MEMOIRE - création d’un segment - opération de contrôle d’un segment : - parmi lesquelles la suppression du segment - attachement d’un segment à un processus - détachement d’un segment d’un processus - lire et écrire dans un segment
LE FICHIER /usr/include/sys/shm.h contient des définitions : - constantes relatives aux droits - structures - shmid_ds qui correspond à peu près au type segment de mémoire - shminfo, contient des informations sur l’ensemble des segments définis dans le système
CREATION D’UN SEGMENT DE MEMOIRE la fonction shmget retourne l’identificateur entier du segment ou -1 en cas d’erreur : #include <stdio.h> #include <sys/types.h> #include <sys/shm.h> ..... Id = shmget (IPC_PRIVATE, nb_octets, IPC_CREAT | IPC_EXCL | 0666);
CONTROLE D’UN SEGMENT DE MÉMOIRE la fonction shmctl retourne 0 (- 1 en cas d’erreur) Exemple : shmctl (id, IPC_RMID, 0); supprime le segment d’identificateur id
ATTACHEMENT D’UN SEGMENT A UN PROCESSUS la fonction shmat retourne l’adresse de début du segment sous forme d’un void * Exemple d’un segment contenant des entiers, p contient l’adresse de début du segment int *p; p = (int*) shmat (id, NULL, 0); Le pointeur p permet ensuite de gérer tous les emplacements du segment comme un tableau pour les opérations classiques de lecture ou écriture dans le segment.
DETACHEMENT D ’UN SEGMENT D ’UN PROCESSUS la fonction shmdt retourne 0 (- 1 en cas d’échec) Exemple avec les notations précédentes : shmdt ((void *) p);