Provided by: manpages-de-dev_1.11-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 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/vm/hugetlbpage.txt   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  um  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   dermmap(2)-Schalter
                   MAP_NORESERVE. Reservieren Sie 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 Benutzer-ID des aufrufenden
              Prozesses gesetzt.

              shm_perm.cgid  und shm_perm.gid werden auf die effektive Gruppen-ID 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 Auftreten eines Fehlers enthält errno einen der folgenden Werte:

       EACCES Der  Benutzer hat keine Zugriffsrechte auf das gemeinsame Speichersegment und keine
              CAP_IPC_OWNER-Capability.

       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 Speicher-IDs 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

       Das  Einbinden  von  <sys/types.h> und <sys/ipc.h> ist nicht auf Linux oder in irgendeiner
       Version von POSIX erforderlich. Einige alte  Implementierungen  benötigten  das  Einbinden
       dieser  Header-Dateien und das SVID dokumentiert ihr Einbinden ebenfalls. Anwendungen, die
       auf  solche  alten  Systeme  portierbar  sein  sollen,  könnten   das   Einbinden   dieser
       Header-Dateien erfordern.

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

              Da es  nicht  möglich  ist,  nur  einen  Teil  eines  gemeinsamen  Speichersegments
              abzubilden,  setzt  der  Betrag  virtuellen Speichers eine weitere Beschränkung der
              maximalen Größe eines benutzbaren  Segments:  Zum  Beispiel  können  auf  i386  die
              größten  Segmente,  die  abgebildet  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 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  Wahl  des  Namens  IPC_PRIVATE  war  vielleicht  unglücklich.  IPC_NEW wäre für diese
       Funktion besser gewesen.

SIEHE AUCH

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

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  4.04  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 http://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>.