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