Linux |
CentOS 4.8 |
|
shmget(2) |
shmget − Allouer un segment de mémoire partagée. |
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t clé, int size, int shmflg); |
shmget() renvoie l’identificateur du segment de mémoire partagée associé à la valeur de l’argument clé. Un nouveau segment mémoire, de taille size arrondie au multiple supérieur de PAGE_SIZE, est créé si clé a la valeur IPC_PRIVATE ou si aucun segment de mémoire partagée n’est associé à clé, et IPC_CREAT est présent dans shmflg. shmflg est composé de : |
IPC_CREAT |
pour créer un nouveau segment. Sinon shmget() recherchera le segment associé à clé, vérifiera que l’appelant a la permission de recevoir l’identifiant shmid associé au segment, et contrôlera que le segment n’est pas détruit. |
||
IPC_EXCL |
est utilisé avec IPC_CREAT pour garantir l’échec si le segment existe déjà . |
mode d’accès (les 9 bits de poids faibles) |
indiquant les permissions pour le propriétaire, le groupe et les autres. Actuellement la permission d’exécution n’est pas utilisée par le système. |
Si un nouveau segment est créé, les permissions d’accès de shmflg sont copiées dans le membre shm_perm de la structure shmid_ds décrivant le segment. Cette structure est définie ainsi : |
struct shmid_ds { struct ipc_perm shm_perm; /* Permissions d’accès */ 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 opérateur */ short shm_nattch; /* Nombre d’attachements */ }; |
struct ipc_perm { key_t key; ushort uid; /* UID et GID effectifs du propriétaire */ ushort gid; ushort cuid; /* UID et GID effectif du créateur */ ushort cgid; ushort mode; /* Mode d’accès sur 9 bits de poids faible */ ushort seq; /* Numéro de séquence */ }; |
De plus, durant la création, le système initialise la structure shmid_ds associée au segment comme suit : |
shm_perm.cuid et shm_perm.uid contiennent l’UID effectif de l’appelant. shm_perm.cgid et shm_perm.gid contiennent le GID effectif de l’appelant. Les 9 bits de poids faibles de shm_perm.mode contiennent les 9 bits de poids faibles de shmflg. shm_segsz prend la valeur size. shm_lpid, shm_nattch, shm_atime et shm_dtime sont mis à 0. shm_ctime contient l’heure actuelle |
fork() |
Après un fork() le fils hérite des segments de mémoire partagée. |
|
exec() |
Après un exec() tous les segments de mémoire partagée sont détachés (pas détruits). |
|
exit() |
Lors d’un exit() tous les segments de mémoire partagée sont détachés (pas détruits). |
Un identificateur de segment shmid valide est renvoyé en cas de réussite, sinon −1 est renvoyé et errno contient le code d’erreur. |
EINVAL |
SHMMIN > size ou size > SHMMAX, ou size plus grand que la taille du segment. |
||
EEXIST |
On a indiqué IPC_CREAT | IPC_EXCL et le segment existe déjà . |
||
EIDRM |
Le segment est détruit. |
||
ENOSPC |
Tous les ID de mémoire partagée sont utilisés, ou l’allocation d’un segment partagé de taille size dépasserait les limites de mémoire partagée du système. |
||
ENOENT |
Aucun segment n’est associé à clé, et IPC_CREAT n’etait pas indiqué. |
||
EACCES |
L’appelant n’a pas les autorisations d’accès au segment. |
||
ENOMEM |
Pas assez de mémoire. |
IPC_PRIVATE n’est pas une option mais une valeur de type key_t. Si cette valeur spéciale est utilisée comme clé, l’appel système ignore tout sauf les 9 bits de poids faibles de shmflg et tente de créer un nouveau segment. Les limites suivantes influent sur l’appel système shmget : |
SHMALL |
Nombre maximal de pages de mémoire partagée sur le système. |
||
SHMMAX |
Taille maximale d’un segment partagé (actuellement 4 Mo). |
||
SHMMIN |
Taille minimale d’un segment partagé. (actuellement 1 octet, bien que PAGE_SIZE soit la valeur effectivement utilisée). |
||
SHMMNI |
Nombre maximal de segments de mémoire partagée sur le système (actuellement 4096, mais 128 avant Linux 2.3.99). |
Il n’y a pas de limite pour le nombre de segments partagés par processus (sauf SHMMNI). |
SVr4, SVID. SVr4 mentionne une condition d’erreur supplémentaire EEXIST. Ni SVr4, ni SVID ne mentionnent l’erreur EIDRM. |
Indiquer à la fois IPC_CREAT et IPC_EXCL dans shmflg garantit seulement la création d’un nouveau segment, et non pas l’exclusivite d’accès à ce segment. |
ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2). |
Christophe Blaess, 1997. |
shmget(2) |