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

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>.
Linux 2. August 2019 SHMOP(2)