Provided by: manpages-de-dev_0.5-4.1ubuntu1_all bug

BEZEICHNUNG

       shmop - Gemeinsame Speicheroperationen

ÜBERSICHT

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

       char*shmat(intshmid, char*shmaddr, intshmflg)

       intshmdt(char*shmaddr)

BESCHREIBUNG

       Die   Funktion   shmat   hängt  das  durch  shmid  erkannte  gemeinsame
       Speichersegment an das Datensegment des aufrufenden Prozesses an.   Die
       Adresse  des  Anhangs  wird  durch  shmaddr  nach  einem  der folgenden
       Kriterien bestimmt:

              Wenn shmaddr  0  ist,  versucht  das  System  einen  noch  nicht
              zugeordneten  Bereich  zwischen  1  -  1.5G  zu finden (von oben
              beginnend und abwärts verlaufend).

              Wenn shmaddr nicht 0 ist und SHM_RND  in  shmflg,  gesetzt  ist,
              wird  die Adresse durch Abrundung von shmaddr als Vielfaches von
              SHMLBA  bestimmt.   Andernfalls  muss  shmaddr  eine  an   einem
              Speicherblock  ausgerichtete Adresse sein, an welcher der Anhang
              beginnt.

       Ist SHM_RDONLY in shmflg, gesetzt, wird das  Segment  für  Lesezugriffe
       angehängt  und  der  Prozess muss die Berechtigung für Lesezugriffe auf
       das Segment besitzen.   Alternativ  wird  das  Segment  für  Lese-  und
       Schreibzugriffe  angehängt  und  der  Prozess muss die Berechtigung für
       Lese- und Schreibzugriffe auf das Segment besitzen.   Es  besteht  kein
       sinnvoller   Anwendungsbedarf   für  Speichersegmente  mit  gemeinsamem
       Zugriff mit ausschließlicher Schreibberechtigung.

       Der brk -Wert des aufrufenden Prozesses wird durch das  Anhängen  nicht
       verändert.   Das  Segment  wird  bei  Beenden des Prozesses automatisch
       entfernt.  Ein und dasselbe Segment  kann  mit  Lese-  bzw.  Lese-  und
       Schreibzugriff  einmal  oder  mehrfach  an den Adressraum des Prozesses
       angehängt werden.

       Nach einem erfolgreichen shmat -Aufruf,  aktualisiert  das  System  die
       Bestandteile der dem Speichersegment zugeordneten Struktur shmid_ds wie
       folgt:

              shm_atime wird auf die aktuelle Zeit gesetzt.

              shm_lpid wird  mit  der  Prozess-ID  des  aufrufenden  Prozesses
              überschrieben.

              shm_nattch wird um 1 erhöht.

       Beachten  Sie,  dass das Anhängen auch erfolgreich verlaufen kann, wenn
       das gemeinsame Speichersegment als "zu löschen" markiert ist.

       Die Funktion shmdt entfernt  das  gemeinsame  Speichersegment  aus  dem
       Datensegment  des  aufrufenden Prozesses, in welchem dieses sich an der
       durch  shmaddr  angegebenen  Adresse  befindet.   Das  zu   entfernende
       gemeinsame  Speichersegment  muss eines der momentan (am Adressraum des
       Prozesses)  angehängten  sein,  wobei  shmaddr  dem  Rückgabewert   des
       anhängenden 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  mit  der  Prozess-ID  des  aufrufenden Prozesses
              überschrieben.

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

       Der  eingenommene  Bereich  im  Benutzerspeicherbereich des aufrufenden
       Prozesses wird freigegeben.

SYSTEM CALLS

       fork() Nach  einem  fork()  erbt  der   Kind-Prozess   das   angehängte
              gemeinsame Speichersegment.

       exec() Nach    einem   exec()   sind   alle   angehängten   gemeinsamen
              Speichersegmente entkoppelt (nicht zerstört).

       exit() Nach   einem   exit()   sind   alle   angehängten    gemeinsamen
              Speichersegmente entkoppelt (nicht zerstört).

RÜCKGABEWERT

       Nach  einem Fehler geben beide Funktionen -1 in errno zurück und weisen
       so auf  den  Fehler  hin.   Andernfalls  gibt  shmat  die  Adresse  des
       angehängten Speichersegments und shmdt gibt 0 zurück.

FEHLER

       Wenn  shmat  fehlschlägt,  ist  errno nach dem Rücksprung mit einem der
       folgenden Werte belegt:

       EACCES     Der aufrufende Prozess  hat  keine  Zugriffsrechte  für  den
                  angeforderten Anhangtyp.

       EINVAL     Ungültiger  shmid  -Wert,  nicht  zugeordneter  (d.h.  nicht
                  seitenkonform  und  SHM_RND  wurde  nicht  angegeben)   oder
                  ungültiger  shmaddr  -Wert  oder das Anhängen bei brk schlug
                  fehl.

       ENOMEM     Es  konnte  kein  Speicher  für  den  Descriptor  oder   die
                  Seitentabellen bereitgestellt werden.

       Die  Funktion  shmdt schlägt nur fehl, wenn an der Adresse shmaddr kein
       gemeinsames Speichersegment angehängt ist. In diesem  Fall  wird  errno
       bei der Rückgabe auf EINVAL gesetzt.

ANMERKUNGEN

       Bei Ausführung eines fork(2) -Systemaufrufs, erbt der Kind-Prozess alle
       angehängten gemeinsamen Speichersegmente.

       Das gemeinsame Speichersegment  eines  Prozesses  der  einen  execve(2)
       -Systemaufruf  ausführt  wird  nicht an den daraus entstandenen Prozess
       angehängt.

       Der folgende Systemparameter beeinflusst einen shmat -Systemaufruf:

       SHMLBA     Adresskoefizient der Segmentuntergrenze.  Muss seitenkonform
                  sein.  In der aktuellen Umsetzung ist der Wert SHMBLA gleich
                  PAGE_SIZE.

       Die Umsetzung hat keinen inneren Einschränkungen der  maximalen  Anzahl
       von Speichersegmenten pro Prozess (SHMSEG)

KONFORM ZU

       SVr4,  SVID.   Unter  SVr4  ist  eine  weitere  Fehlerbedingung  EMFILE
       dokumentiert.

SIEHE AUCH

       ipc(5), shmctl(2), shmget(2).