shmget - ein gemeinsames System-V-Speichersegment reservieren
Standard-C-Bibliothek (libc, -lc)
ÜBERSICHT
#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.
memfd_create(2), shmat(2), shmctl(2),
shmdt(2), ftok(3), capabilities(7),
shm_overview(7), sysvipc(7)
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von
Ralf Demmer <rdemmer@rdemmer.de>, Chris Leick
<c.leick@vollbio.de> und Helge Kreutzmann <debian@helgefjell.de>
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.