Provided by:
manpages-de-dev_0.5-4.1ubuntu1_all 
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).