shmop(2) shmop(2)
NAME
shmop: shmat, shmdt - Operationen auf Shared Memory
SYNTAX
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
BESCHREIBUNG
shmat() fügt das Shared-Memory-Segment (gemeinsam benutzte Speicher-
segment), das zur Kennung shmid gehört, an das Datensegment des aufru-
fenden Prozesses an. Das Segment wird mit der Adresse verbunden, die
durch eine der folgenden Möglichkeiten angegeben wird:
- Wenn shmaddr gleich (void *) 0 ist, wird das Segment mit der ersten
verfügbaren Adresse verbunden, die vom System ausgewählt wird.
- Wenn shmaddr ungleich (void *) 0 und (shmflg&SHMRND) wahr ist,
wird das Segment mit der von
(shmaddr - ((ptrdifft)shmaddr%SHMLBA)) angegebenen Adresse verbun-
den.
- Wenn shmaddr ungleich (void *) 0 und (shmflg&SHMRND) unwahr ist,
wird das Segment mit der von shmaddr angegebenen Adresse verbunden.
shmdt() entfernt das durch die Adresse shmaddr angegebene Shared-
Memory-Segment vom Datensegment des aufrufenden Prozesses.
Das Segment wird zum Lesen angefügt, wenn (shmflg&SHMRDONLY) wahr ist
andernfalls wird es zum Lesen und Schreiben angefügt
shmat() ist erfolglos und macht das Shared-Memory-Segment nicht ver-
fügbar, wenn einer oder mehrere der nachstehenden Punkte zutreffen:
EINVAL shmid ist keine gültige Shared-Memory-Kennung.
EACCES Die Zugriffserlaubnis wird dem aufrufenden Prozeß verwei-
gert.
ENOMEM Der verfügbare Platz im Datensegment reicht für die Aufnahme
des Shared-Memory-Segments nicht aus.
EINVAL shmaddr ist ungleich Null, und der Wert von
(shmaddr - ((ptrdifft)shmaddr%SHMLBA)) ist eine unzulässige
Adresse.
EINVAL shmaddr ist ungleich Null, (shmflg&SHMRND) ist unwahr und
der Wert von shmaddr ist eine unzulässige Adresse.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
shmop(2) shmop(2)
EMFILE Die Anzahl der Shared-Memory-Segmente, die dem aufrufenden
Prozeß zugeteilt sind, würde den systembedingten Grenzwert
überschreiten.
EINVAL shmdt() ist erfolglos und entfernt das Shared-Memory-Segment
nicht, wenn shmaddr nicht die Datensegment-Startadresse
eines Shared-Memory-Segments ist.
EINVAL Das ausgeführte Programm ist ein speziell vorabgeladenes
Programm. Das Argument shmaddr liegt illegal zwischen den
Text- und Daten-Bereichen.
ERGEBNIS
Nach erfolgreicher Beendigung ist der Rückgabewert wie folgt:
shmat() gibt die Datensegment-Startadresse des angefügten Shared-
Memory-Segmentes zurück.
shmdt() gibt 0 zurück.
Andernfalls wird -1 zurückgegeben, und errno wird zur Anzeige auf den
Fehlerwert gesetzt.
HINWEISE
Der Benutzer muß Shared-Memory-Segmente ausdrücklich entfernen, nach-
dem der letzte Verweis auf diese entfernt worden ist.
Es kann in Zukunft Änderungen bei den Schnittstellen für Interprozeß-
Kommunikation geben. Sie sollten daher Ihre Anwendungen so gestalten,
daß in Modulen, die shmctl() verwenden, diese Funktion später leicht
durch eine andere ersetzt werden kann.
SIEHE AUCH
exec(2), exit(2), fork(2), shmctl(2), shmget(2), preload(8).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98