Hauptindex | Abschnitt 2 | Optionen |
# include <sys/types.h> # include <sys/ipc.h> # include <sys/shm.h>
char*shmat(intshmid, char*shmaddr, intshmflg)
intshmdt(char*shmaddr)
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 muß 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 Prozeß muß die Berechtigung für Lesezugriffe auf das Segment besitzen. Alternativ wird das Segment für Lese- und Schreibzugriffe angehängt und der Prozeß muß 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 Prozeß-ID des aufrufenden Prozesses überschrieben. | |
shm_nattch wird um 1 erhöht. | |
Beachten Sie, daß 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 muß 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 Prozeß-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. | |
fork() | Nach einem fork() erbt der Kind-Prozeß 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). |
EACCES | Der aufrufende Prozeß 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. |
Das gemeinsame Speichersegment eines Prozesses der einen execve(2) -Systemaufruf ausführt wird nicht an den daraus entstandenen Prozeß angehängt.
Der folgende Systemparameter beeinflußt einen shmat -Systemaufruf:
SHMLBA | Adresskoefizient der Segmentuntergrenze. Muß seitenkonform sein. In der aktuellen Umsetzung ist der Wert SHMBLA gleich PAGE_SIZE. |
28. November 1993 | SHMOP (2) | Linux 0.99.13 |
Hauptindex | Abschnitt 2 | Optionen |
Bitte richten Sie Ihre Kommentare zu diesem Handbuch Seite Service, Ben Bullock. Privacy policy.