Man page - shm_open(3)

Packages contains this manual

Available languages:

en fr ja

Manual

shm_open

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
VERSIONS
STANDARDS
HISTORIQUE
EXEMPLES
Source du programme : pshm_ucase.h
Source programme : pshm_ucase_bounce.c
Source du programme : pshm_ucase_send.c
VOIR AUSSI
TRADUCTION

NOM

shm_open, shm_unlink - Créer, ouvrir ou supprimer des objets en mémoire partagée POSIX

BIBLIOTHÈQUE

BibliothÚque de temps réel ( librt , -lrt )

SYNOPSIS

#include <sys/mman.h>
#include <sys/stat.h>
/* Pour les constantes de mode */
#include <fcntl.h>
/* Pour les constantes O_* */

int shm_open(const char * nom , int masque , mode_t mode );
int shm_unlink(const char *
nom );

DESCRIPTION

La fonction shm_open () crĂ©e et ouvre un nouvel objet en mĂ©moire partagĂ©e POSIX, ou ouvre un objet existant. Il s’agit d’un descripteur utilisable par des processus indĂ©pendants pour projeter la mĂȘme rĂ©gion mĂ©moire Ă  l’aide de mmap (2). La fonction shm_unlink () rĂ©alise l’opĂ©ration inverse 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 en mĂ©moire partagĂ©e Ă  crĂ©er ou ouvrir. Pour un fonctionnement portable, un objet en mĂ©moire partagĂ©e doit ĂȘtre identifiĂ© par un nom au format /un_nom ; c’est-Ă -dire une chaĂźne terminĂ©e par un octet de valeur zĂ©ro d’au plus NAME_MAX (c’est-Ă -dire 255) caractĂšres, et commençant par une barre oblique (« / ») suivie d’un caractĂšre ou plus, ces derniers n’étant pas des barres obliques.

masque est un masque de bits associant Ă  l’aide d’un OU logique une et une seule 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 un accĂšs en lecture ( PROT_READ ).

O_RDWR

Ouvrir l’objet en lecture et Ă©criture.

O_CREAT

CrĂ©er l’objet en mĂ©moire partagĂ©e s’il n’existe pas. L’utilisateur et le groupe propriĂ©taires de l’objet proviennent des ID effectifs du processus appelant, et les bits de permission sont dĂ©finis en fonction des 9 bits de poids faible de mode , exceptĂ© que les bits qui sont dĂ©finis dans le masque de mode de fichier pour la crĂ©ation du processus (consultez umask (2)) sont effacĂ©s pour le nouvel objet. Un jeu de constantes de macroutilisables 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 en mĂ©moire partagĂ©e a une taille initiale nulle — elle peut ĂȘtre dĂ©finie avec ftruncate (2). Les octets d’un objet en mĂ©moire partagĂ©e nouvellement créé sont automatiquement initialisĂ©s Ă  zĂ©ro.

O_EXCL

Si O_CREAT Ă©tait aussi prĂ©cisĂ© et si un objet en mĂ©moire partagĂ©e avec le mĂȘme nom existait dĂ©jĂ , renvoyer une erreur. La vĂ©rification de l’existence de l’objet et sa crĂ©ation s’il n’existe pas sont rĂ©alisĂ©es de maniĂšre atomique.

O_TRUNC

Si l’objet en mĂ©moire partagĂ©e existe dĂ©jĂ , 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 de fichierrĂ©fĂ©rençant l’objet en mĂ©moire partagĂ©e. Ce descripteur sera le plus petit numĂ©ro disponible dans la table des descripteurs du processus. L’attribut FD_CLOEXEC (consultez fcntl (2)) sera activĂ© pour le descripteur de fichier.

Le descripteur de fichier 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 en 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 associĂ©e. 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 distinct sera créé).

VALEUR RENVOYÉE

Si elles rĂ©ussissent, shm_open () renvoie un descripteur de fichier (un entier non nĂ©gatif) et shm_unlink () renvoie 0 . En cas d’échec, les deux fonctions renvoient -1 et dĂ©finissent errno pour indiquer l’erreur.

ERREURS

EACCES

La permission d’utiliser shm_unlink () sur l’objet en mĂ©moire partagĂ©e a Ă©tĂ© refusĂ©e.

EACCES

L’utilisation de shm_open () pour ouvrir l’objet nom dans le mode spĂ©cifiĂ© a Ă©tĂ© refusĂ©e, ou O_TRUNC a Ă©tĂ© spĂ©cifiĂ© et l’appelant n’a pas les permissions d’écriture sur l’objet.

EEXIST

O_CREAT et O_EXCL ont Ă©tĂ© spĂ©cifiĂ©s dans shm_open () et un objet de mĂ©moire partagĂ©e du mĂȘme nom existe dĂ©jĂ .

EINVAL

L’argument nom de shm_open () n’était pas valable.

EMFILE

La limite du nombre de descripteurs de fichiers par processus a été atteinte.

ENAMETOOLONG

La longueur du nom dépasse PATH_MAX .

ENFILE

La limite du nombre total de fichiers ouverts pour le systÚme entier a été atteinte.

ENOENT

Tentative d’ouvrir avec shm_open () un objet nom qui n’existe pas, alors que l’attribut O_CREAT n’a pas Ă©tĂ© spĂ©cifiĂ©.

ENOENT

Tentative d’utiliser shm_unlink () sur un objet nom qui n’existe pas.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3879006-1.png

VERSIONS

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 des objets de mĂ©moire partagĂ©e POSIX utilise un systĂšme de fichiers tmpfs (5) dĂ©diĂ©, montĂ© en principe sous /dev/shm .

STANDARDS

POSIX.1-2008.

HISTORIQUE

glibc 2.2. POSIX.1-2001.

POSIX.1-2001 indique que le groupe propriĂ©taire d’un objet en mĂ©moire partagĂ©e 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 ». POSIX.1-2008 indique que le groupe propriĂ©taire peut ĂȘtre dĂ©fini soit avec l’ID de groupe du processus appelant, soit, si l’objet est visible dans le systĂšme de fichiers, avec l’ID de groupe du rĂ©pertoire parent.

EXEMPLES

Les programmes ci-dessous utilisent la mĂ©moire partagĂ©e POSIX et des sĂ©maphores non nommĂ©s POSIX pour Ă©changer des donnĂ©es. Le programme « bounce » (qui doit ĂȘtre exĂ©cutĂ© en premier) illustre le cas d’une chaĂźne placĂ©e en mĂ©moire partagĂ©e par le programme « send ». Lorsque les donnĂ©es ont Ă©tĂ© modifiĂ©es, le programme « send » affiche le contenu de la mĂ©moire partagĂ©e modifiĂ©. Voici un exemple d’exĂ©cution des deux programmes :

$ ./pshm_ucase_bounce /myshm &
[1] 270171
$ ./pshm_ucase_send /myshm bonjour
BONJOUR

Vous trouverez plus de détails à propos de ces programmes ci-dessous.

Source du programme : pshm_ucase.h

Ce fichier d’en-tĂȘte est inclus par les deux programmes ci-dessous. Sa principale fonction consiste Ă  dĂ©finir une structure qui sera imposĂ©e Ă  l’objet en mĂ©moire partagĂ© entre les deux programmes.

#ifndef PSHM_UCASE_H
#define PSHM_UCASE_H
#include <semaphore.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
#define BUF_SIZE 1024 /* Maximum size for exchanged string */
/* Define a structure that will be imposed on the shared
memory object */
struct shmbuf {
sem_t sem1; /* POSIX unnamed semaphore */
sem_t sem2; /* POSIX unnamed semaphore */
size_t cnt; /* Number of bytes used in 'buf' */
char buf[BUF_SIZE]; /* Data being transferred */
};
#endif // include guard

Source programme : pshm_ucase_bounce.c

Le programme « bounce » crĂ©e un nouvel objet en mĂ©moire partagĂ©e avec le nom spĂ©cifiĂ© comme argument de la ligne de commande et le dimensionne de maniĂšre Ă  correspondre Ă  la taille de la structure shmbuf dĂ©finie dans le fichier d’en-tĂȘte. Il projette ensuite l’objet dans l’espace d’adressage du processus et initialise deux sĂ©maphores POSIX Ă  0 Ă  l’intĂ©rieur de l’objet.

Une fois le premier sĂ©maphore postĂ© par le programme « send », le programme « bounce » met en capitales les donnĂ©es placĂ©es en mĂ©moire par le programme « send », puis poste le second sĂ©maphore pour indiquer au programme « send » qu’il peut maintenant accĂ©der Ă  la mĂ©moire partagĂ©e.

/* pshm_ucase_bounce.c
Licensed under GNU General Public License v2 or later.
*/
#include <ctype.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include "pshm_ucase.h"
int
main(int argc, char *argv[])
{
int fd;
char *shmpath;
struct shmbuf *shmp;
if (argc != 2) {
fprintf(stderr, "Usage: %s /shm-path\n", argv[0]);
exit(EXIT_FAILURE);
}
shmpath = argv[1];
/* Create shared memory object and set its size to the size
of our structure. */
fd = shm_open(shmpath, O_CREAT | O_EXCL | O_RDWR, 0600);
if (fd == -1)
errExit("shm_open");
if (ftruncate(fd, sizeof(struct shmbuf)) == -1)
errExit("ftruncate");
/* Map the object into the caller's address space. */
shmp = mmap(NULL, sizeof(*shmp), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if (shmp == MAP_FAILED)
errExit("mmap");
/* Initialize semaphores as process-shared, with value 0. */
if (sem_init(&shmp->sem1, 1, 0) == -1)
errExit("sem_init-sem1");
if (sem_init(&shmp->sem2, 1, 0) == -1)
errExit("sem_init-sem2");
/* Wait for 'sem1' to be posted by peer before touching
shared memory. */
if (sem_wait(&shmp->sem1) == -1)
errExit("sem_wait");
/* Convert data in shared memory into upper case. */
for (size_t j = 0; j < shmp->cnt; j++)
shmp->buf[j] = toupper((unsigned char) shmp->buf[j]);
/* Post 'sem2' to tell the peer that it can now
access the modified data in shared memory. */
if (sem_post(&shmp->sem2) == -1)
errExit("sem_post");
/* Unlink the shared memory object. Even if the peer process
is still using the object, this is okay. The object will
be removed only after all open references are closed. */
shm_unlink(shmpath);
exit(EXIT_SUCCESS);
}

Source du programme : pshm_ucase_send.c

Le programme « send » accepte deux arguments de ligne de commande : le nom d’un objet en mĂ©moire partagĂ©e prĂ©alablement créé par le programme « bounce » et une chaĂźne Ă  copier dans cet objet.

Le programme ouvre l’objet en mĂ©moire partagĂ©e et le projette dans son espace d’adressage. Ensuite, il copie les donnĂ©es spĂ©cifiĂ©es Ă  l’aide du second argument vers la mĂ©moire partagĂ©e et poste le premier sĂ©maphore pour informer le programme « bounce » qu’il peut maintenant accĂ©der aux donnĂ©es. Lorsque le programme « bounce » a postĂ© le second sĂ©maphore, le programme « send » affiche le contenu de la mĂ©moire partagĂ©e sur la sortie standard.

/* pshm_ucase_send.c
Licensed under GNU General Public License v2 or later.
*/
#include <fcntl.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
#include "pshm_ucase.h"
int
main(int argc, char *argv[])
{
int fd;
char *shmpath, *string;
size_t len;
struct shmbuf *shmp;
if (argc != 3) {
fprintf(stderr, "Usage: %s /shm-path string\n", argv[0]);
exit(EXIT_FAILURE);
}
shmpath = argv[1];
string = argv[2];
len = strlen(string);
if (len > BUF_SIZE) {
fprintf(stderr, "String is too long\n");
exit(EXIT_FAILURE);
}
/* Open the existing shared memory object and map it
into the caller's address space. */
fd = shm_open(shmpath, O_RDWR, 0);
if (fd == -1)
errExit("shm_open");
shmp = mmap(NULL, sizeof(*shmp), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if (shmp == MAP_FAILED)
errExit("mmap");
/* Copy data into the shared memory object. */
shmp->cnt = len;
memcpy(&shmp->buf, string, len);
/* Tell peer that it can now access shared memory. */
if (sem_post(&shmp->sem1) == -1)
errExit("sem_post");
/* Wait until peer says that it has finished accessing
the shared memory. */
if (sem_wait(&shmp->sem2) == -1)
errExit("sem_wait");
/* Write modified data in shared memory to standard output. */
write(STDOUT_FILENO, &shmp->buf, len);
write(STDOUT_FILENO, "\n", 1);
exit(EXIT_SUCCESS);
}

VOIR AUSSI

close (2), fchmod (2), fchown (2), fcntl (2), fstat (2), ftruncate (2), memfd_create (2), mmap (2), open (2), umask (2), shm_overview (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Lucien Gentis <lucien.gentis@waika9.com>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .