Provided by: manpages-de-dev_2.16-1_all bug

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/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  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 Fehlschlag wird errno auf eines der Folgenden gesetzt:

       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

       Unter  Linux  und  allen  Versionen  von POSIX ist die Einbindung von <sys/types.h> und <sys/ipc.h> nicht
       notwendig. Allerdings benötigten einige alte Implementierungen die Einbindung dieser  Header-Dateien  und
       SVID  dokumentierte  auch  ihre  Einbindung.  Anwendungen,  die  auf solche alten Systeme portierbar sein
       müssen, könnten die Einbindung dieser Header-Dateien benötigen.

       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 Namenswahl IPC_PRIVATE war vielleicht unglücklich, IPC_NEW würde seine Funktion deutlicher anzeigen.

SIEHE AUCH

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

KOLOPHON

       Diese Seite ist Teil der Veröffentlichung  5.03  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>.

Linux                                            2. August 2019                                        SHMGET(2)