SHMOP(2)

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 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.

Der eingenommene Bereich im Benutzerspeicherbereich des aufrufenden Prozesses wird freigegeben.

SYSTEM CALLS

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).

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 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.

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-Prozeß alle angehängten gemeinsamen Speichersegmente.

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.

Die Umsetzung hat keinen inneren Einschränkungen der maximalen Anzahl von Speichersegmenten pro Prozeß (SHMSEG)

KONFORM ZU
SVr4, SVID. Unter SVr4 ist eine weitere Fehlerbedingung EMFILE dokumentiert.

SIEHE AUCH
ipc(5), shmctl(2), shmget(2).