Provided by: manpages-de-dev_0.10-1_all bug

BEZEICHNUNG

       shmat, shmdt - Operationen mit gemeinsam benutztem Speicher

"UBERSICHT

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

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

       int shmdt(const void *shmaddr);

BESCHREIBUNG

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

       Falls shmaddr  NULL  ist,  wahlt  das  System  eine  geeignete  (freie)
       Adresse, an der das Segment eingeblendet wird.

       Wenn  shmaddr  nicht NULL ist und SHM_RND in shmflg angegeben ist, 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 Einblenden beginnt.

       Ist  SHM_RDONLY  in  shmflg  gesetzt,  wird  das  Segment   zum   Lesen
       eingeblendet und der Prozess muss die Berechtigung fur Lesezugriffe auf
       das Segment besitzen.  Andernfalls  wird  das  Segment  zum  Lesen  und
       Schreiben  eingeblendet und der Prozess muss die Berechtigung fur Lese-
       und  Schreibzugriffe  auf  das  Segment   besitzen.   Ein   gemeinsames
       Speichersegment mit reinem Schreibzugriff ist nicht vorgesehen.

       Mit  dem  (Linux-spezifischen) Schalter SHM_REMAP in shmflag konnen Sie
       bestimmen, dass das Abbilden des Segments jede vorhandene Abbildung  im
       Bereich  von  shmaddr bis zum Ende des Segments ersetzt. (Falls bereits
       eine  Abbildung  in  diesem   Adressbereich   existiert,   wurde   dies
       normalerweise zu dem Fehler EINVAL fuhren.) In diesem Fall darf shmaddr
       nicht NULL sein.

       Der brk(2)-Wert des aufrufenden Prozesses  wird  durch  das  Einblenden
       nicht verandert. 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 erhoht.

       shmdt() lost 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 Ruckgabewert 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 Loschen markiert ist, wird es geloscht.

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

       Nach    einem    exec(2)    sind    alle   eingeblendeten   gemeinsamen
       Speichersegmente vom Prozess abgelost.

       Bei einem exit(2) sind alle eingeblendeten gemeinsamen Speichersegmente
       vom Prozess abgelost.

R"UCKGABEWERT

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

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

FEHLER

       Wenn shmat fehlschlagt,  wird  errno  mit  einem  der  folgenden  Werte
       belegt:

       EACCES Dem  aufrufenden  Prozess  fehlen die notigen Zugriffsrechte fur
              den angeforderten Einblendetyp und die CAP_IPC_OWNER-Fahigkeit.

       EINVAL ungultiger shmid-Wert, nicht ausgerichteter (d.h. nicht  an  die
              SeitengroBe  angepasst  und  SHM_RND wurde nicht angegeben) oder
              ungultiger shmaddr-Wert oder es wurde  SHM_REMAP  angegeben  und
              shmaddr war NULL.

       ENOMEM Es   konnte   kein   Speicher   fur   den  Deskriptor  oder  die
              Seitentabellen reserviert werden.

       Wenn shmat() fehlschlagt, 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

       SVr4, POSIX.1-2001.

       In SVID 3 (oder vielleicht fruher) wurde der Typ des Arguments  shmaddr
       von  char  * in const void * und der von shmat() zuruckgegebene Typ von
       char * in void * geandert.  (Linux-Libc4  und  -Libc5  haben  die  char
       *-Prototypen, Glibc2 hat void *.)

ANMERKUNGEN

       Die bevorzugte, portierbare Moglichkeit 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 mussen
       alle innerhalb des gemeinsamen  Speichers  verwalteten  Zeiger  relativ
       (typischerweise zur Startadresse des Segments) statt absolut sein.

       Auf  Linux  ist  es  moglich,  sogar  ein  gemeinsames  Speichersegment
       einzublenden, wenn es bereits zum Loschen  markiert  ist.  POSIX.1-2001
       spezifiziert dieses Verhalten jedoch nicht und andere Implementierungen
       unterstutzen es nicht.

       Der folgende Systemparameter beeinflusst shmat():

       SHMLBA Adress-Multiplikator der Segmentuntergrenze. Muss  seitenkonform
              sein.  In der aktuellen Implemtentierung ist der Wert von SHMBLA
              gleich PAGE_SIZE.

       Die  Implemtentierung  hat  keinen  wesentlichen  Einschrankungen   der
       maximalen Anzahl von gemeinsamen Speichersegmenten pro Prozess (SHMSEG)

SIEHE AUCH

       brk(2),     mmap(2),     shmctl(2),     shmget(2),     capabilities(7),
       shm_overview(7), svipc(7)

KOLOPHON

       Diese  Seite  ist  Teil  der   Veroffentlichung   3.32   des   Projekts
       Linux-man-pages.  Eine Beschreibung des Projekts und Informationen, wie
       Fehler    gemeldet     werden     konnen,     finden     sich     unter
       http://www.kernel.org/doc/man-pages/.

"UBERSETZUNG

       Die  deutsche  Ubersetzung  dieser  Handbuchseite wurde von Ralf Demmer
       <rdemmer@rdemmer.de> und Chris Leick <c.leick@vollbio.de> erstellt.

       Diese Ubersetzung ist Freie Dokumentation; lesen Sie  die  GNU  General
       Public   License   Version   3  oder  neuer  bezuglich  der  Copyright-
       Bedingungen. Es wird KEINE HAFTUNG ubernommen.

       Wenn  Sie  Fehler  in  der  Ubersetzung  dieser  Handbuchseite  finden,
       schicken     Sie     bitte     eine     E-Mail     an     <debian-l10n-
       german@lists.debian.org>.