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:

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 »huge pages« reservieren. Die Linux-Kernel-Quelldatei Documentation/vm/hugetlbpage.txt 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 Seiten 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.

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 Auftreten eines Fehlers enthält errno einen der folgenden Werte:
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).

KONFORM ZU

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

SHM_HUGETLB und SHM_NORESERVE sind Linux-Erweiterungen.

ANMERKUNGEN

Das Einbinden von <sys/types.h> und <sys/ipc.h> ist nicht auf Linux oder in irgendeiner Version von POSIX erforderlich. Einige alte Implementierungen benötigten das Einbinden dieser Header-Dateien und das SVID dokumentiert ihr Einbinden ebenfalls. Anwendungen, die auf solche alten Systeme portierbar sein sollen, könnten das Einbinden dieser Header-Dateien erfordern.

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:
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 MB).
Because it is not possible to map just part of a shared memory segment, the amount of virtual memory places another limit on the maximum size of a usable segment: for example, on i386 the largest segments that can be mapped have a size of around 2.8 GB, and on x86-64 the limit is around 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).

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 Wahl des Namens IPC_PRIVATE war vielleicht unglücklich. IPC_NEW wäre für diese Funktion besser gewesen.

SIEHE AUCH

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

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.16 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 <debian-l10n-german@lists.debian.org>.

30. April 2018 Linux