Scroll to navigation

SHMGET(2) Linux-Programmierhandbuch SHMGET(2)

BEZEICHNUNG

shmget - ein gemeinsames System-V-Speichersegment reservieren

ÜBERSICHT

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t Schlüssel, size_t Größe, int shmflg);

BESCHREIBUNG

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:

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.
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.
Das Segment unter Benutzung von »großer Speicherseiten« reservieren. Die Linux-Kernel-Quelldatei Documentation/admin-guide/mm/hugetlbpage.rst enthält weitere Informationen.
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).
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.

RÜCKGABEWERT

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.

FEHLER

Bei Fehlschlag wird errno auf eines der Folgenden gesetzt:

Der Benutzer hat keine Zugriffsrechte auf das gemeinsame Speichersegment und keine CAP_IPC_OWNER-Capability in dem Benutzernamensraum, der seinen IPC-Namensraum beherrscht.
IPC_CREAT und IPC_EXCL wurden in shmflg angegeben, aber für Schlüssel existiert bereits ein gemeinsam benutztes Speichersegment.
Es wurde ein neues Segment erstellt und Größe ist kleiner als SHMMIN oder größer als SHMMAX.
Es existiert ein Segment für den angegebenen Schlüssel, aber Größe ist größer als die Größe dieses Segments.
Die systemweite Beschränkung für die Gesamtzahl offener Dateien wurde erreicht.
Für den angegebenen Schlüssel existiert kein Segment und IPC_CREAT wurde nicht angegeben.
Es konnte kein Speicher für Segment-Zuschlag reserviert werden.
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.
Der Schalter SHM_HUGETLB wurde angegeben, der Aufrufende war aber nicht privilegiert (hatte nicht die Capability CAP_IPC_LOCK).

KONFORM ZU

POSIX.1-2001, POSIX.1-2008, SVr4.

SHM_HUGETLB und SHM_NORESERVE sind Linux-Erweiterungen.

ANMERKUNGEN

Unter Linux und allen Versionen von POSIX ist die Einbindung von <sys/types.h> und <sys/ipc.h> nicht notwendig. Allerdings benötigten einige alte Implementierungen die Einbindung dieser Header-Dateien und SVID dokumentierte auch ihre Einbindung. Anwendungen, die auf solche alten Systeme portierbar sein müssen, könnten die Einbindung dieser Header-Dateien benötigen.

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.

Beschränkungen des gemeinsam genutzten Speichers

Es gelten die folgenden Einschränkungen für die Ressourcen gemeinsamer Speichersegmente, die einen shmget()-Aufruf betreffen:

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.
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 MB).
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.
Minimalgröße eines gemeinsamen Speichersegments in Byte: abhängig vom der Implementierung (momentan 1 Byte, obwohl PAGE_SIZE die effektive Minimalgröße darstellt).
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).

Linux-Anmerkungen

Bis Version 2.3.30 gab Linux EIDRM für ein shmget() auf einem gemeinsamen Speichersegment zurück, das zur Löschung vorgesehen war.

FEHLER

Die Namenswahl IPC_PRIVATE war vielleicht unglücklich, IPC_NEW würde seine Funktion deutlicher anzeigen.

BEISPIELE

Siehe shmop(2).

SIEHE AUCH

memfd_create(2), shmat(2), shmctl(2), shmdt(2), ftok(3), capabilities(7), shm_overview(7), sysvipc(7)

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

Ü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.

11. April 2020 Linux