Provided by: manpages-de-dev_2.5-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 Prozess-ID 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 Prozess-ID 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), svipc(7)

KOLOPHON

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