.\" Copyright 1993 Giorgio Ciucci (giorgio@crcc.it) .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" .\" Modified Sun November 28 17:06:19 1993, Rik Faith (faith@cs.unc.edu) .\" with material from Luigi P. Bai (lpb@softint.com) .\" Portions Copyright 1993 Luigi P. Bai .\" Modified Tue Oktober 22 22:04:23 1996 by Eric S. Raymond .\" .\" Translated into German by Ralf Demmer, Translation & Consulting .\" rdemmer@rdemmer.de, http://www.rdemmer.de .\" Berlin, 29.1.1999 .\" .TH SHMOP 2 "28. November 1993" "Linux 0.99.13" "Systemaufrufe" .SH BEZEICHNUNG shmop \- Gemeinsame Speicheroperationen .SH "ÜBERSICHT" .nf .B # include .B # include .B # include .fi .sp .BI char *shmat ( int shmid , .BI char * shmaddr , .BI int shmflg ) .sp .BI int shmdt ( char * shmaddr ) .SH BESCHREIBUNG Die Funktion .B shmat hängt das durch .B shmid erkannte gemeinsame Speichersegment an das Datensegment des aufrufenden Prozesses an. Die Adresse des Anhangs wird durch .I shmaddr nach einem der folgenden Kriterien bestimmt: .IP Wenn .I shmaddr .BR 0 ist, versucht das System einen noch nicht zugeordneten Bereich zwischen 1 \- 1.5G zu finden (von oben beginnend und abwärts verlaufend). .IP Wenn .I shmaddr nicht .B 0 ist und .B SHM_RND in .IR shmflg , gesetzt ist, wird die Adresse durch Abrundung von .I shmaddr als Vielfaches von .BR SHMLBA bestimmt. Andernfalls muss .I shmaddr eine an einem Speicherblock ausgerichtete Adresse sein, an welcher der Anhang beginnt. .PP Ist .B SHM_RDONLY in .IR 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. .PP Der .B 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. .PP Nach einem erfolgreichen .B shmat -Aufruf, aktualisiert das System die Bestandteile der dem Speichersegment zugeordneten Struktur .B shmid_ds wie folgt: .IP .B shm_atime wird auf die aktuelle Zeit gesetzt. .IP .B shm_lpid wird mit der Prozess-ID des aufrufenden Prozesses überschrieben. .IP .B shm_nattch wird um 1 erhöht. .PP Beachten Sie, dass das Anhängen auch erfolgreich verlaufen kann, wenn das gemeinsame Speichersegment als "zu löschen" markiert ist. .PP Die Funktion .B shmdt entfernt das gemeinsame Speichersegment aus dem Datensegment des aufrufenden Prozesses, in welchem dieses sich an der durch .IR shmaddr angegebenen Adresse befindet. Das zu entfernende gemeinsame Speichersegment muss eines der momentan (am Adressraum des Prozesses) angehängten sein, wobei .I shmaddr dem Rückgabewert des anhängenden .B shat -Aufrufs entspricht. .PP Nach einem erfolgreichen .B shmdt -Aufruf, aktualisiert das System die Bestandteile der dem Speichersegment zugeordneten Struktur .B shmid_ds wie folgt: .IP .B shm_dtime wird auf die aktuelle Zeit gesetzt. .IP .B shm_lpid wird mit der Prozess-ID des aufrufenden Prozesses überschrieben. .IP .B shm_nattch wird um 1 verringert. Wenn es dabei zu 0 wird und das Segment zum Löschen markiert ist, wird es gelöscht. .PP Der eingenommene Bereich im Benutzerspeicherbereich des aufrufenden Prozesses wird freigegeben. .PP .SH SYSTEM CALLS .TP .B fork() Nach einem .B fork() erbt der Kind-Prozess das angehängte gemeinsame Speichersegment. .TP .B exec() Nach einem .B exec() sind alle angehängten gemeinsamen Speichersegmente entkoppelt (nicht zerstört). .TP .B exit() Nach einem .B exit() sind alle angehängten gemeinsamen Speichersegmente entkoppelt (nicht zerstört). .PP .SH "RÜCKGABEWERT" Nach einem Fehler geben beide Funktionen .B \-1 in .B errno zurück und weisen so auf den Fehler hin. Andernfalls gibt .B shmat die Adresse des angehängten Speichersegments und .B shmdt gibt .BR 0 zurück. .SH FEHLER Wenn .B shmat fehlschlägt, ist .B errno nach dem Rücksprung mit einem der folgenden Werte belegt: .TP 11 .B EACCES Der aufrufende Prozess hat keine Zugriffsrechte für den angeforderten Anhangtyp. .TP .B EINVAL Ungültiger .I shmid -Wert, nicht zugeordneter (d.h. nicht seitenkonform und .B SHM_RND wurde nicht angegeben) oder ungültiger .I shmaddr -Wert oder das Anhängen bei .BR brk schlug fehl. .TP .B ENOMEM Es konnte kein Speicher für den Descriptor oder die Seitentabellen bereitgestellt werden. .PP Die Funktion .B shmdt schlägt nur fehl, wenn an der Adresse .IR shmaddr kein gemeinsames Speichersegment angehängt ist. In diesem Fall wird .B errno bei der Rückgabe auf .BR EINVAL gesetzt. .SH ANMERKUNGEN Bei Ausführung eines .BR fork (2) -Systemaufrufs, erbt der Kind-Prozess alle angehängten gemeinsamen Speichersegmente. .PP Das gemeinsame Speichersegment eines Prozesses der einen .BR execve (2) -Systemaufruf ausführt wird nicht an den daraus entstandenen Prozess angehängt. .PP Der folgende Systemparameter beeinflusst einen .B shmat -Systemaufruf: .TP 11 .B SHMLBA Adresskoefizient der Segmentuntergrenze. Muss seitenkonform sein. In der aktuellen Umsetzung ist der Wert .B SHMBLA gleich .BR PAGE_SIZE . .PP Die Umsetzung hat keinen inneren Einschränkungen der maximalen Anzahl von Speichersegmenten pro Prozess .RB ( SHMSEG ) .SH "KONFORM ZU" SVr4, SVID. Unter SVr4 ist eine weitere Fehlerbedingung EMFILE dokumentiert. .SH "SIEHE AUCH" .BR ipc (5), .BR shmctl (2), .BR shmget (2).