Provided by: manpages-de-dev_4.26.0-1_all bug

BEZEICHNUNG

       shmget - ein gemeinsames System-V-Speichersegment reservieren

BIBLIOTHEK

       Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT

       #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 »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.

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

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

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

   Linux-Anmerkungen
       Bis Linux 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)

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

Linux man-pages 6.9.1                              2. Mai 2024                                         shmget(2)