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) Adresse, an der das Segment eingeblendet wird.
- *
- 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-Fähigkeit.
- 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.
SVr4, POSIX.1-2001.
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-2001
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-Architekuren ist es 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 3.74 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
http://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>.