Ü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 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 um 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 dermmap(2)-Schalter MAP_NORESERVE. Reservieren Sie 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 Benutzer-ID des aufrufenden Prozesses gesetzt.
- shm_perm.cgid und shm_perm.gid werden auf die effektive Gruppen-ID 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.
- 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 Speicher-IDs 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^24Dieser 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^24Dieser 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 abzubilden, setzt der Betrag virtuellen Speichers eine weitere Beschränkung der maximalen Größe eines benutzbaren Segments: Zum Beispiel können auf i386 die größten Segmente, die abgebildet 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).
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.KOLOPHON
Diese Seite ist Teil der Veröffentlichung 4.06 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 <[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 <[email protected]>.