oracular (2) shmget.2.gz

Provided by: manpages-de-dev_4.23.1-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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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 ⟨debian-l10n-german@lists.debian.org⟩.