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

BEZEICHNUNG

       shmat, shmdt - System-V-Operationen mit gemeinsam benutztem Speicher

ÜBERSICHT

       #include <sys/types.h>
       #include <sys/shm.h>

       void *shmat(int shmid, const void *shmaddr, int shmflg);

       int shmdt(const void *shmaddr);

BESCHREIBUNG

   shmat()
       shmat()  blendet  das  durch  shmid bezeichnete gemeinsame System-V-Speichersegment in den
       Adressraum des aufrufenden Prozesses ein. Die Adresse der Einblendung wird  durch  shmaddr
       nach einem der folgenden Kriterien bestimmt:

       *  Falls shmaddr NULL ist, wählt das System eine geeignete (freie), an einer Speicherseite
          ausgerichtete Adresse, um das Segment einzublenden.

       *  Wenn shmaddr nicht NULL ist und SHM_RND in shmflg angegeben  wurde,  wird  die  Adresse
          durch Abrundung von shmaddr als Vielfaches von SHMLBA bestimmt.

       *  Andernfalls  muss  shmaddr  eine  an einer Speicherseite ausgerichtete Adresse sein, an
          welcher das Anhängen beginnt.

       Zusätzlich zu SHM_RND  dürfen  die  folgenden  Schalter  im  Bitmask-Argument  von  shmflg
       angegeben werden:

       SHM_EXEC (Linux-spezifisch; seit Linux 2.6.9)
              ermöglicht,  dass  der Inhalt des Segments ausgeführt wird. Der Aufrufende muss auf
              dem Segment Ausführungsrechte besitzen.

       SHM_RDONLY
              hängt das Segment mit  Lesezugriff  an.  Der  Prozess  muss  die  Berechtigung  für
              Lesezugriffe  auf  das Segment besitzen. Falls dieser Schalter nicht angegeben ist,
              wird das Segment mit Lese- und Schreibzugriff angehängt und  der Prozess  muss  die
              Berechtigung   für   Lese-  und  Schreibzugriffe  auf  das  Segment  besitzen.  Ein
              gemeinsames Speichersegment mit reinem Schreibzugriff ist nicht vorgesehen.

       SHM_REMAP (Linux-spezifisch)
              Dieser Schalter gibt an, dass das Abbilden des Segments jedes existierende Abbilden
              im  Bereich  von  shmaddr  bis zur Größe des Segments ersetzen soll. (Falls bereits
              eine Abbildung in diesem Adressbereich existiert, würde dies normalerweise  zu  dem
              Fehler EINVAL führen.) In diesem Fall darf shmaddr nicht NULL sein.

       Der  brk(2)-Wert  des aufrufenden Prozesses wird durch das Einblenden nicht verändert. Das
       Segment wird bei Beenden des Prozesses automatisch abgetrennt. Das  gleiche  Segment  kann
       mit  Lese-  sowie  mit Lese- und Schreibzugriff einmal oder mehrfach an den Adressraum des
       Prozesses eingeblendet werden.

       Nach einem erfolgreichen shmat()-Aufruf aktualisiert das System die Bestandteile  der  dem
       Speichersegment zugeordneten shmid_ds-Struktur (siehe shmctl(2)) wie folgt:

              shm_atime wird auf die aktuelle Zeit gesetzt.

              shm_lpid wird auf die Prozesskennung des aufrufenden Prozesses gesetzt.

              shm_nattch wird um eins erhöht.

   shmdt()
       shmdt()  löst  das  gemeinsame  Speichersegment,  das an der Adresse shmaddr liegt aus dem
       Adressraum des aufrufenden Prozesses. Das zu entfernende gemeinsame  Speichersegment  muss
       momentan   mit   shmaddr   eingeblendet   sein,  das  dem  Rückgabewert  des  einbendenden
       shat()-Aufrufs entspricht.

       Nach einem erfolgreichen shmdt()-Aufruf aktualisiert das System die Bestandteile  der  dem
       Speichersegment zugeordneten Struktur shmid_ds wie folgt:

              shm_dtime wird auf die aktuelle Zeit gesetzt.

              shm_lpid wird auf die Prozesskennung des aufrufenden Prozesses gesetzt.

              shm_nattch  wird  um  eins  verringert. Wenn es dabei zu 0 wird und das Segment zum
              Löschen markiert ist, wird es gelöscht.

RÜCKGABEWERT

       Bei Erfolg gibt  shmat()  die  Adresse  des  eingeblendeten  gemeinsamen  Speichersegments
       zurück;  bei einem Fehler wird (void *) -1 zurückgegeben und errno so gesetzt, dass es den
       Grund des Fehlers anzeigt.

       Bei Erfolg gibt shmdt() 0 zurück; bei einem Fehler wird  -1  zurückgegeben  und  errno  so
       gesetzt, dass es den Grund des Fehlers anzeigt.

FEHLER

       Wenn shmat fehlschlägt, wird errno mit einem der folgenden Werte belegt:

       EACCES Dem  aufrufenden  Prozess  fehlen  die nötigen Zugriffsrechte für den angeforderten
              Einblendetyp und die CAP_IPC_OWNER-Capability in dem Benutzernamensraum, der seinen
              IPC-Namensraum beherrscht.

       EIDRM  shmid zeigt auf einen entfernten Bezeichner.

       EINVAL ungültiger   shmid-Wert,  nicht  ausgerichteter  (d.h.  nicht  an  die  Seitengröße
              angepasst und SHM_RND wurde nicht angegeben) oder ungültiger shmaddr-Wert  oder  es
              wurde SHM_REMAP angegeben und shmaddr war NULL.

       ENOMEM Es  konnte  kein  Speicher  für  den  Deskriptor oder die Seitentabellen reserviert
              werden.

       Wenn shmat() fehlschlägt, ist errno mit einem der folgenden Werte belegt:

       EINVAL Es ist kein gemeinsames Speichersegment an shmaddr eingeblendet  oder  shmaddr  ist
              nicht an der Seitengrenze ausgerichtet.

KONFORM ZU

       POSIX.1-2001, POSIX.1-2008, SVr4.

       In SVID 3 (oder vielleicht früher) wurde der Typ des Arguments shmaddr von char * in const
       void * und der von shmat() zurückgegebene Typ von char * in void * geändert.

ANMERKUNGEN

       Nach einem fork(2) erbt der Kindprozess das eingeblendete gemeinsame Speichersegment.

       Nach einem exec(2) sind  alle  eingeblendeten  gemeinsamen  Speichersegmente  vom  Prozess
       abgelöst.

       Bei  einem  exit(2)  sind  alle  eingeblendeten  gemeinsamen  Speichersegmente vom Prozess
       abgelöst.

       Die bevorzugte,  portierbare  Möglichkeit  ein  gemeinsames  Speichersegment  einzublenden
       besteht  darin,  shmat() mit shmaddr gleich NULL zu benutzen. Sie sollten wissen, dass das
       eingeblendete gemeinsame Speichersegment auf diese Art  an  unterschiedliche  Adressen  in
       unterschiedlichen  Prozessen  eingeblendet  werden kann. Deshalb müssen alle innerhalb des
       gemeinsamen Speichers verwalteten Zeiger  relativ  (typischerweise  zur  Startadresse  des
       Segments) statt absolut sein.

       Auf  Linux  ist  es  möglich,  sogar ein gemeinsames Speichersegment einzublenden, wenn es
       bereits zum Löschen markiert ist. POSIX.1 spezifiziert dieses Verhalten jedoch  nicht  und
       andere Implementierungen unterstützen es nicht.

       Der folgende Systemparameter beeinflusst shmat():

       SHMLBA untere  Segmentgrenze  des  Adressvielfachen. Wenn in einem Aufruf von shmat() eine
              Adresse explizit angegeben wurde. sollte der  Aufrufende  sicherstellen,  dass  die
              Adresse  ein  Vielfaches  dieses  Wertes  ist.  Dies  ist auf einigen Architekturen
              notwendig, um eine gute Leistung des CPU-Zwischenspeichers zu gewährleisten oder um
              sicherzustellen,  dass  unterschiedliche  Anhänge  desselben  Segments  konsistente
              Ansichten innerhalb  des  CPU-Zwischenspeichers  haben.  SHMLBA  ist  normalerweise
              irgendein    Vielfaches    von   der   Seitengröße   des   Systems.   (Auf   vielen
              Linux-Architekturen ist SHMLBA dasselbe wie die Seitengröße des Systems.)

       Die  Implementierung  hat  keine  inhärenten  pro-Prozess-Einschränkungen  bezüglich   der
       maximalen Anzahl von gemeinsamen Speichersegmenten (SHMSEG).

SIEHE AUCH

       brk(2), mmap(2), shmctl(2), shmget(2), 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>
       und Chris Leick <c.leick@vollbio.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>.