NOM
shm_open, shm_unlink - Créer/ouvrir et supprimer des objets de mémoire
partagés POSIX
SYNOPSIS
#include <sys/mman.h>
#include <sys/stat.h> /* Pour les constantes des modes */
#include <fcntl.h> /* Pour les constantes O_* */
int shm_open(const char *nom, int oflag, mode_t mode);
int shm_unlink(const char *nom);
Effectuez l’édition des liens avec l’option -lrt.
La fonction shm_open() crée et ouvre un nouvel objet de mémoire partagé
POSIX, ou ouvre un objet existant. Il s’agit d’un descripteur
utilisable par d’autres processus avec mmap(2) pour projeter la même
région mémoire. La fonction shm_unlink() réalise l’opération
complémentaire en supprimant l’objet créé précédemment par shm_open().
Le fonctionnement de shm_open() est analogue à celui de open(2). nom
indique l’objet mémoire partagé à créer ou ouvrir. Pour un
fonctionnement portable, un objet mémoire partagé doit être identifié
par un nom au format /un_nom ; c’est à dire une chaîne terminée par un
caractère nul d’au plus NAME_MAX (c’est-à-dire 255) caractère,
commençant par une barre oblique (« / »), suivi d’un caractère ou plus,
ces derniers n’étant pas des barres obliques.
oflag est un masque de bit associant l’une des deux constantes O_RDONLY
ou O_RDWR et un ou plusieurs des attributs décrits ci-après.
O_RDONLY Ouvrir l’objet en lecture seule. Un tel objet ne pourra être
projeté en mémoire avec mmap(2) qu’avec l’accès (PROT_READ).
O_RDWR Ouvrir l’objet en lecture et écriture.
O_CREAT Créer l’objet de mémoire partagée s’il n’existe pas.
L’utilisateur et le groupe propriétaires de l’objet
proviennent des IDs effectifs du processus appelant, et les
bits de permission sont fixés en fonction des 9 bits de
poids faible de mode, hormis les bits qui sont fixés dans le
masque de création du processus (voir umask(2)) et qui sont
effacés. Un jeu de constantes utilisables pour définir le
mode est décrit dans open(2) (les définitions symboliques de
ces constantes peuvent être obtenues en incluant
<sys/stat.h>).
Un nouvel objet de mémoire partagé a une taille initiale
nulle - on la fixe en utilisant ftruncate(2). Les octets
d’un objet mémoire partagé nouvellement créé sont
automatiquement initialisés à zéro.
O_EXCL Si O_CREAT était précisé et si un objet de mémoire partagée
avec le même nom existait déjà, renvoyer une erreur. La
vérification et l’existence et la création éventuelle sont
réalisées de manière atomique.
O_TRUNC Si l’objet de mémoire partagée existait, tronquer sa taille
à zéro.
Les définitions des valeurs de ces attributs peuvent être obtenues en
incluant <fcntl.h>.
Si elle réussit, la fonction shm_open() renvoie un nouveau descripteur
décrivant l’objet de mémoire partagée. Le descripteur est assuré d’être
le plus petit numéro disponible dans la table des descripteurs du
processus. L’attribut FD_CLOEXEC (voir fcntl(2)) sera activé sur le
descripteur de fichier.
Le descripteur est utilisé normalement pour les appels ultérieurs à
ftruncate(2) (pour un objet nouvellement créé) et mmap(2). Après un
appel à mmap(2) le descripteur peut être fermé sans affecter la
projection mémoire.
Le fonctionnement de shm_unlink() est analogue à celui de unlink(2) :
il supprime le nom d’un objet de mémoire partagée, et, une fois que
tous les processus ont supprimé leur projection en mémoire, libère et
détruit le contenu de la portion de mémoire. Après un appel réussi à
shm_unlink(), les tentatives d’appeler shm_open() avec le même nom
échoueront (sauf si O_CREAT est spécifié, auquel cas un nouvel objet
distinc est créé).
VALEUR RENVOYÉE
S’il réussit, l’appel shm_open() renvoie un descripteur de fichier non
négatif. S’il échoue, shm_open() renvoie -1. shm_unlink() renvoie 0
s’il réussit ou -1 en cas d’erreur.
ERREURS
Lors d’un échec, errno indique la cause de l’erreur. Les codes
possibles dans errno sont les suivants :
EACCES Interdiction d’utiliser shm_unlink() sur l’objet de mémoire
partagée.
EACCES shm_open() refusée pour le nom dans le mode indiqué, ou O_TRUNC
a été réclamé et l’appelant n’a pas les permissions d’écriture
sur l’objet.
EEXIST O_CREAT et O_EXCL étaient réclamés dans shm_open() et un objet
de mémoire partagée du même nom existait déjà.
EINVAL L’argument nom de shm_open() était invalide.
EMFILE Le processus a déjà ouvert le nombre maximal de fichiers.
ENAMETOOLONG
La longueur du nom dépasse PATH_MAX.
ENFILE La limite du nombre total de fichiers ouverts sur le système a
été atteinte.
ENOENT Tentative d’ouvrir avec shm_open() un nom qui n’existe pas, sans
attribut O_CREAT.
ENOENT Tentative d’utiliser shm_unlink() sur un nom qui n’existe pas.
VERSIONS
Ces fonctions sont fournies depuis la glibc 2.2.
CONFORMITÉ
POSIX.1-2001.
POSIX.1-2001 indique que le groupe propriétaire d’un objet nouvellement
créé utilise soit l’ID de groupe du processus appelant, soit un « ID de
groupe par défaut défini par le système ».
NOTES
POSIX ne précise pas le comportement de la combinaison O_RDONLY et
O_TRUNC. Sous Linux, la troncature aura lieu - cela n’est pas
nécessairement le cas sous d’autres systèmes Unix.
L’implémentation sous Linux 2.4 des objets de mémoire partagée POSIX
utilise un système de fichiers dédiés, monté en principe sous /dev/shm.
VOIR AUSSI
close(2), fchmod(2), fchown(2), fcntl(2), fstat(2), ftruncate(2),
mmap(2), open(2), umask(2), shm_overview(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Nicolas François
<nicolas.francois@centraliens.net> et l’équipe francophone de
traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».