shmget - ein gemeinsames System-V-Speichersegment reservieren
Standard-C-Bibliothek (
libc,
-lc)
#include <sys/shm.h>
int shmget(key_t Schlüssel, size_t Größe, int shmflg);
shmget() gibt den Bezeichner des gemeinsamen System-V-Speichersegments
zurück, der mit dem Wert des Arguments
Schlüssel
verknüpft ist. Es kann entweder dazu verwandt werden, den Bezeichner
eines vorher erstellten gemeinsamen Speichersegments zu erhalten (wenn
shmflg Null ist und
Schlüssel nicht den Wert
IPC_PRIVATE hat) oder um eine neue Gruppe zu erstellen.
Es wird ein neues gemeinsames Speichersegment erstellt, dessen
Größe dem auf ein Vielfaches von
PAGE_SIZE gerundeten
Wert von
Größe entspricht, falls
Schlüssel
den Wert
IPC_PRIVATE hat oder
Schlüssel nicht den Wert
IPC_PRIVATE hat, kein gemeinsames Speichersegment zu
Schlüssel existiert und
IPC_CREAT in
shmflg
angegeben wurde.
Wenn
shmflg sowohl
IPC_CREAT als auch
IPC_EXCL angibt und
ein gemeinsames Speichersegment für
Schlüssel bereits
existiert, dann schlägt
shmget() fehl und
errno wird auf
EEXIST gesetzt. (Dies ist mit dem Effekt der Kombination von
O_CREAT
| O_EXCL für
open(2) vergleichbar.)
Der Wert
shmflg besteht aus:
- IPC_CREAT
- Erstellung eines neuen Segments. Wenn dieser Schalter nicht
benutzt wird, dann wird shmget() das mit Schlüssel
verbundene Segment suchen und prüfen, ob der Benutzer auf das
Segment zugreifen darf.
- IPC_EXCL
- Dieser Schalter wird mit IPC_CREAT verwendet, um
sucherzustellen, dass dieser Aufruf das Segment erzeugt. Falls das Segment
bereits existiert, schlägt der Aufruf fehl.
-
SHM_HUGETLB (seit Linux 2.6)
- Das Segment unter Benutzung von
»großen« Speicherseiten reservieren. Die
Linux-Kernel-Quelldatei
Documentation/admin-guide/mm/hugetlbpage.rst enthält weitere
Informationen.
-
SHM_HUGE_2MB, SHM_HUGE_1GB (seit Linux
3.8)
- wird zusammen mit SHM_HUGETLB verwendet, um
alternative Hugetlb-Seitengrößen (2 MB bzw.
1 GB) auf Systemen auszuwählen, die mehrere
Hugetlb-Seitengrößen unterstützen.
- Allgemeiner ausgedrückt, kann die gewünschte
Größe großer Speicherseiten durch Kodieren des
Logarithmus zur Basis 2 der gewünschten Seitengröße
in den ersten sechs Bit versetzt am Versatz SHM_HUGE_SHIFT
konfiguriert werden. Daher sind die beiden Konstanten oberhalb wie folgt
definiert:
-
#define SHM_HUGE_2MB (21 << SHM_HUGE_SHIFT)
#define SHM_HUGE_1GB (30 << SHM_HUGE_SHIFT)
- Für einige zusätzliche Details sehen Sie die
Diskussion der ähnlich benannten Konstanten in mmap(2).
-
SHM_NORESERVE (seit Linux 2.6.15)
- Dieser Schalter dient dem gleichen Zweck wie der
mmap(2)-Schalter MAP_NORESERVE. Reserviert keinen
Auslagerungsspeicher für dieses Segment. Wenn Auslagerungsspeicher
reserviert ist, ist es sicher, dass das Segment verändert werden
kann. Wenn kein Auslagerungsspeicher reserviert ist, könnte
SIGSEGV beim Schreiben empfangen werden, falls kein physischer
Speicher verfügbar ist. Siehe auch die Diskussion der Datei
/proc/sys/vm/overcommit_memory in proc(5).
Zusätzlich zu den oben genannten Schaltern geben die niederwertigsten
neun Bits von
shmflg die Rechte des Besitzers, der Gruppe und dem Rest
der Welt an. Diese Bits haben dasselbe Format und dieselbe Bedeutung wie das
Argument
mode von
open(2). Zurzeit werden die
Ausführungsrechte nicht vom System benutzt.
Wenn ein neues gemeinsames Speichersegment erstellt wird, wird sein Inhalt mit
Nullwerten initialisiert und die damit verbundene Datenstruktur
shmid_ds (siehe
shmctl(2)) wie folgt initialisiert:
- •
-
shm_perm.cuid und shm_perm.uid werden auf die
effektive Benutzerkennung des aufrufenden Prozesses gesetzt.
- •
-
shm_perm.cgid und shm_perm.gid werden auf die
effektive Gruppenkennung des aufrufenden Prozesses gesetzt.
- •
- Die niederwertigsten 9 Bit von shm_perm.mode werden
auf die niederwertigsten 9 Bit von shmflg gesetzt.
- •
-
shm_segsz wird auf den Wert von
Größe gesetzt.
- •
-
shm_lpid, shm_nattch, shm_atime und
shm_dtime werden auf 0 gesetzt.
- •
-
shm_ctime wird auf die aktuelle Zeit gesetzt.
Wenn das gemeinsame Speichersegment bereits existiert, werden die Zugriffsrechte
überprüft und nachgesehen, ob es für die Freigabe
markiert wurde.
Bei Erfolg wird ein gültiger Bezeichner für gemeinsam benutzten
Speicher zurückgegeben. Bei einem Fehler wird -1 zurückgegeben
und
errno entsprechend gesetzt.
- EACCES
- Der Benutzer hat keine Zugriffsrechte auf das gemeinsame
Speichersegment und keine CAP_IPC_OWNER-Capability in dem
Benutzernamensraum, der seinen IPC-Namensraum beherrscht.
- EEXIST
-
IPC_CREAT und IPC_EXCL wurden in
shmflg angegeben, aber für Schlüssel existiert
bereits ein gemeinsam benutztes Speichersegment.
- EINVAL
- Es wurde ein neues Segment erstellt und
Größe ist kleiner als SHMMIN oder
größer als SHMMAX.
- EINVAL
- Es existiert ein Segment für den angegebenen
Schlüssel, aber Größe ist
größer als die Größe dieses Segments.
- ENFILE
- Die systemweite Beschränkung für die
Gesamtzahl offener Dateien wurde erreicht.
- ENOENT
- Für den angegebenen Schlüssel
existiert kein Segment und IPC_CREAT wurde nicht angegeben.
- ENOMEM
- Es konnte kein Speicher für Segment-Zuschlag
reserviert werden.
- ENOSPC
- Alle möglichen gemeinsamen Speicherkennungen wurden
in Anspruch genommen ( SHMMNI) oder das Reservieren eines Segments
der Größe Größe würde dazu
führen, dass die systemweite Begrenzung für gemeinsamen
Speicher ( SHMALL) überschritten wird.
- EPERM
- Der Schalter SHM_HUGETLB wurde angegeben, der
Aufrufende war aber nicht privilegiert (hatte nicht die Capability
CAP_IPC_LOCK) und ist auch kein Mitglied der Gruppe
sysctl_hugetlb_shm_group; siehe die Beschreibung von
/proc/sys/vm/sysctl_hugetlb_shm_group in proc(5).
POSIX.1-2001, POSIX.1-2008, SVr4.
SHM_HUGETLB und
SHM_NORESERVE sind Linux-Erweiterungen.
IPC_PRIVATE ist kein Schalterfeld, aber ein
key_t-Typ. Wenn dieser
spezielle Wert für
schalter verwandt wird, ignoriert der
Systemaufruf alles bis auf die niederwertigsten 9 Bit von
shmflg und
erstellt ein neues gemeinsames Speichersegment.
Es gelten die folgenden Einschränkungen für die Ressourcen
gemeinsamer Speichersegmente, die einen
shmget()-Aufruf betreffen:
- SHMALL
- systemweite Beschränkung des Gesamtbetrags gemeinsam
genutzten Speichers, gemessen in Einheiten der Seitengröße
des Systems
- Unter Linux kann diese Beschränkung über
/proc/sys/kernel/shmall ermittelt und verändert werden. Seit
Linux 3.16 ist der voreingestellte Wert für diese
Beschränkung:
-
ULONG_MAX - 2^24
- Dieser Wert (der sowohl auf 32- als auch auf 64-Bit-Systeme
anwendbar ist) bewirkt, dass bei Speicherreservierungen keine
Beschränkungen zum Zug kommen. Dieser Wert wurde anstelle von
ULONG_MAX als Voreinstellung gewählt, um Fälle zu
vermeiden, in denen historische Anwendungen einfach die bestehende
Beschränkung erhöht haben, ohne zuerst ihren aktuellen Wert
zu prüfen. Derartige Anwendungen würden den Wert zum
Überlaufen bringen, falls die Beschränkung auf
ULONG_MAX gesetzt wäre.
- Von Linux 2.4 bis 3.15 war der voreingestellte Wert
für diese Beschränkung:
-
SHMMAX / PAGE_SIZE * (SHMMNI / 16)
- Falls SHMMAX und SHMMNI nicht
verändert wurden, dann wird das Ergebnis dieser Formel mit der
Seitengröße multipliziert (um einen Wert in Byte zu
erhalten). Dies ergibt einen Wert von 8 GB als Beschränkung
des gesamten von allen gemeinsamen Speichersegmenten benutzten
Speichers.
- SHMMAX
- maximale Größe in Byte für ein
gemeinsames Speichersegment
- Unter Linux kann diese Einschränkung über
/proc/sys/kernel/shmmax verändert werden. Seit Linux 3.16
ist der voreingestellte Wert für diese Beschränkung:
-
ULONG_MAX - 2^24
- Dieser Wert (der sowohl auf 32- als auch auf 64-Bit-Systeme
anwendbar ist) bewirkt, dass bei Speicherreservierungen keine
Beschränkungen zum Zug kommen. Lesen Sie die Beschreibung von
SHMALL, wenn Sie erfahren möchten, warum dieser Wert
(anstelle von ULONG_MAX) als Voreinstellung verwendet wird.
- Von Linux 2.2 bis 3.15 war der voreingestellte Wert dieser
Beschränkung 0x2000000 (32 MiB).
- Da es nicht möglich ist, nur einen Teil eines
gemeinsamen Speichersegments zu mappen, setzt der Betrag des virtuellen
Speichers eine weitere Beschränkung der maximalen
Größe eines benutzbaren Segments: Zum Beispiel können
auf i386 die größten Segmente, die gemappt werden
können, eine Größe um 2,8 GB haben. Auf x86_64
liegt die Beschränkung bei etwa 127 TB.
- SHMMIN
- Minimalgröße eines gemeinsamen
Speichersegments in Byte: abhängig vom der Implementierung
(momentan 1 Byte, obwohl PAGE_SIZE die effektive
Minimalgröße darstellt).
- SHMMNI
- systemweite Beschränkung der Anzahl gemeinsam
benutzter Speichersegmente. Unter Linux 2.2 war der Vorgabewert für
diese Einschränkung 128, seit Linux 2.4 ist er 4096.
- Unter Linux kann diese Einschränkung über
/proc/sys/kernel/shmmni gelesen und verändert werden.
Die Implementierung hat keine besonderen Einschränkungen für die
maximale Anzahl gemeinsamer Speichersegmente pro Prozess (
SHMSEG).
Bis Linux 2.3.30 gab Linux
EIDRM für ein
shmget() auf einem
gemeinsamen Speichersegment zurück, das zur Löschung vorgesehen
war.
Die Namenswahl
IPC_PRIVATE war vielleicht unglücklich,
IPC_NEW würde seine Funktion deutlicher anzeigen.
Siehe
shmop(2).
memfd_create(2),
shmat(2),
shmctl(2),
shmdt(2),
ftok(3),
capabilities(7),
shm_overview(7),
sysvipc(7)
Die deutsche Übersetzung dieser Handbuchseite wurde von Ralf Demmer
<
[email protected]>, Chris Leick <
[email protected]> und Helge
Kreutzmann <
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer