shmget(2) System Calls Manual shmget(2) BEZEICHNUNG shmget - ein gemeinsames System-V-Speichersegment reservieren BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int shmget(key_t Schlussel, size_t Grosse, int shmflg); BESCHREIBUNG shmget() gibt den Bezeichner des gemeinsamen System-V-Speichersegments zuruck, der mit dem Wert des Arguments Schlussel verknupft ist. Es kann entweder dazu verwandt werden, den Bezeichner eines vorher erstellten gemeinsamen Speichersegments zu erhalten (wenn shmflg Null ist und Schlussel nicht den Wert IPC_PRIVATE hat) oder um eine neue Gruppe zu erstellen. Es wird ein neues gemeinsames Speichersegment erstellt, dessen Grosse dem auf ein Vielfaches von PAGE_SIZE gerundeten Wert von Grosse entspricht, falls Schlussel den Wert IPC_PRIVATE hat oder Schlussel nicht den Wert IPC_PRIVATE hat, kein gemeinsames Speichersegment zu Schlussel existiert und IPC_CREAT in shmflg angegeben wurde. Wenn shmflg sowohl IPC_CREAT als auch IPC_EXCL angibt und ein gemeinsames Speichersegment fur Schlussel bereits existiert, dann schlagt shmget() fehl und errno wird auf EEXIST gesetzt. (Dies ist mit dem Effekt der Kombination von O_CREAT | O_EXCL fur 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 Schlussel verbundene Segment suchen und prufen, 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, schlagt der Aufruf fehl. SHM_HUGETLB (seit Linux 2.6) Das Segment unter Benutzung von >>grossen<< Speicherseiten reservieren. Die Linux-Kernel-Quelldatei Documentation/admin-guide/mm/hugetlbpage.rst enthalt weitere Informationen. SHM_HUGE_2MB SHM_HUGE_1GB (seit Linux 3.8) wird zusammen mit SHM_HUGETLB verwendet, um alternative Hugetlb-Seitengrossen (2 MB bzw. 1 GB) auf Systemen auszuwahlen, die mehrere Hugetlb-Seitengrossen unterstutzen. Allgemeiner ausgedruckt, kann die gewunschte Grosse grosser Speicherseiten durch Kodieren des Logarithmus zur Basis 2 der gewunschten Seitengrosse 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) Fur einige zusatzliche Details sehen Sie die Diskussion der ahnlich 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 fur dieses Segment. Wenn Auslagerungsspeicher reserviert ist, ist es sicher, dass das Segment verandert werden kann. Wenn kein Auslagerungsspeicher reserviert ist, konnte SIGSEGV beim Schreiben empfangen werden, falls kein physischer Speicher verfugbar ist. Siehe auch die Diskussion der Datei /proc/sys/vm/overcommit_memory in proc(5). Zusatzlich 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 Ausfuhrungsrechte 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: o shm_perm.cuid und shm_perm.uid werden auf die effektive Benutzerkennung des aufrufenden Prozesses gesetzt. o shm_perm.cgid und shm_perm.gid werden auf die effektive Gruppenkennung des aufrufenden Prozesses gesetzt. o Die niederwertigsten 9 Bit von shm_perm.mode werden auf die niederwertigsten 9 Bit von shmflg gesetzt. o shm_segsz wird auf den Wert von Grosse gesetzt. o shm_lpid, shm_nattch, shm_atime und shm_dtime werden auf 0 gesetzt. o shm_ctime wird auf die aktuelle Zeit gesetzt. Wenn das gemeinsame Speichersegment bereits existiert, werden die Zugriffsrechte uberpruft und nachgesehen, ob es fur die Freigabe markiert wurde. RUCKGABEWERT Bei Erfolg wird ein gultiger Bezeichner fur gemeinsam benutzten Speicher zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben und errno entsprechend gesetzt. FEHLER 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 fur Schlussel existiert bereits ein gemeinsam benutztes Speichersegment. EINVAL Es wurde ein neues Segment erstellt und Grosse ist kleiner als SHMMIN oder grosser als SHMMAX. EINVAL Es existiert ein Segment fur den angegebenen Schlussel, aber Grosse ist grosser als die Grosse dieses Segments. ENFILE Die systemweite Beschrankung fur die Gesamtzahl offener Dateien wurde erreicht. ENOENT Fur den angegebenen Schlussel existiert kein Segment und IPC_CREAT wurde nicht angegeben. ENOMEM Es konnte kein Speicher fur Segment-Zuschlag reserviert werden. ENOSPC Alle moglichen gemeinsamen Speicherkennungen wurden in Anspruch genommen (SHMMNI) oder das Reservieren eines Segments der Grosse Grosse wurde dazu fuhren, dass die systemweite Begrenzung fur gemeinsamen Speicher (SHMALL) uberschritten 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). STANDARDS POSIX.1-2008. SHM_HUGETLB und SHM_NORESERVE sind Linux-Erweiterungen. GESCHICHTE POSIX.1-2001, SVr4. ANMERKUNGEN IPC_PRIVATE ist kein Schalterfeld, aber ein key_t-Typ. Wenn dieser spezielle Wert fur schalter verwandt wird, ignoriert der Systemaufruf alles bis auf die niederwertigsten 9 Bit von shmflg und erstellt ein neues gemeinsames Speichersegment. Beschrankungen des gemeinsam genutzten Speichers Es gelten die folgenden Einschrankungen fur die Ressourcen gemeinsamer Speichersegmente, die einen shmget()-Aufruf betreffen: SHMALL systemweite Beschrankung des Gesamtbetrags gemeinsam genutzten Speichers, gemessen in Einheiten der Seitengrosse des Systems Unter Linux kann diese Beschrankung uber /proc/sys/kernel/shmall ermittelt und verandert werden. Seit Linux 3.16 ist der voreingestellte Wert fur diese Beschrankung: ULONG_MAX - 2^24 Dieser Wert (der sowohl auf 32- als auch auf 64-Bit-Systeme anwendbar ist) bewirkt, dass bei Speicherreservierungen keine Beschrankungen zum Zug kommen. Dieser Wert wurde anstelle von ULONG_MAX als Voreinstellung gewahlt, um Falle zu vermeiden, in denen historische Anwendungen einfach die bestehende Beschrankung erhoht haben, ohne zuerst ihren aktuellen Wert zu prufen. Derartige Anwendungen wurden den Wert zum Uberlaufen bringen, falls die Beschrankung auf ULONG_MAX gesetzt ware. Von Linux 2.4 bis 3.15 war der voreingestellte Wert fur diese Beschrankung: SHMMAX / PAGE_SIZE * (SHMMNI / 16) Falls SHMMAX und SHMMNI nicht verandert wurden, dann wird das Ergebnis dieser Formel mit der Seitengrosse multipliziert (um einen Wert in Byte zu erhalten). Dies ergibt einen Wert von 8 GB als Beschrankung des gesamten von allen gemeinsamen Speichersegmenten benutzten Speichers. SHMMAX maximale Grosse in Byte fur ein gemeinsames Speichersegment Unter Linux kann diese Einschrankung uber /proc/sys/kernel/shmmax verandert werden. Seit Linux 3.16 ist der voreingestellte Wert fur diese Beschrankung: ULONG_MAX - 2^24 Dieser Wert (der sowohl auf 32- als auch auf 64-Bit-Systeme anwendbar ist) bewirkt, dass bei Speicherreservierungen keine Beschrankungen zum Zug kommen. Lesen Sie die Beschreibung von SHMALL, wenn Sie erfahren mochten, warum dieser Wert (anstelle von ULONG_MAX) als Voreinstellung verwendet wird. Von Linux 2.2 bis 3.15 war der voreingestellte Wert dieser Beschrankung 0x2000000 (32 MiB). Da es nicht moglich ist, nur einen Teil eines gemeinsamen Speichersegments zu mappen, setzt der Betrag des virtuellen Speichers eine weitere Beschrankung der maximalen Grosse eines benutzbaren Segments: Zum Beispiel konnen auf i386 die grossten Segmente, die gemappt werden konnen, eine Grosse um 2,8 GB haben. Auf x86_64 liegt die Beschrankung bei etwa 127 TB. SHMMIN Minimalgrosse eines gemeinsamen Speichersegments in Byte: abhangig vom der Implementierung (momentan 1 Byte, obwohl PAGE_SIZE die effektive Minimalgrosse darstellt). SHMMNI systemweite Beschrankung der Anzahl gemeinsam benutzter Speichersegmente. Unter Linux 2.2 war der Vorgabewert fur diese Einschrankung 128, seit Linux 2.4 ist er 4096. Unter Linux kann diese Einschrankung uber /proc/sys/kernel/shmmni gelesen und verandert werden. Die Implementierung hat keine besonderen Einschrankungen fur die maximale Anzahl gemeinsamer Speichersegmente pro Prozess (SHMSEG). Linux-Anmerkungen Bis Linux 2.3.30 gab Linux EIDRM fur ein shmget() auf einem gemeinsamen Speichersegment zuruck, das zur Loschung vorgesehen war. FEHLER Die Namenswahl IPC_PRIVATE war vielleicht unglucklich, IPC_NEW wurde 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Ralf Demmer , Chris Leick und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.9.1 2. Mai 2024 shmget(2)