BEZEICHNUNG¶
shmget - ein gemeinsames Speichersegment reservieren
ÜBERSICHT¶
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t schluessel, size_t groesse,
int shmflg);
BESCHREIBUNG¶
shmget() gibt den Bezeichner des gemeinsamen Speichersegments
zurück, der mit dem Wert des Arguments
schluessel verknüpft
ist. Es wird ein neues gemeinsames Speichersegment erstellt, dessen
Größe dem auf ein Vielfaches von
PAGE_SIZE gerundeten Wert
von
groesse entspricht, falls
schluessel den Wert
IPC_PRIVATE hat oder
schluessel nicht den Wert
IPC_PRIVATE hat, kein gemeinsames Speichersegment zu
schluessel
exisitiert und
IPC_CREAT in
shmflg angegeben wurde.
Wenn
shmflg sowohl
IPC_CREAT als auch
IPC_EXCL angibt und
ein gemeinsames Speichersegment für
schluessel bereits existiert,
dann schlägt
shmget() fehl und
errno wird auf
EEXIST
gesetzt. (Dies ist mit dem Effekt der Kombination von
O_CREAT | O_EXCL
für
open(2) vergleichbar.)
Der Wert
shmflg besteht aus:
- IPC_CREAT
- um ein neues Segment zu erstellen. Wenn dieser Schalter
nicht benutzt wird, dann wird shmget() das mit schluessel
verbundene Segment suchen und prüfen, ob der Benutzer auf das Segment
zugreifen darf.
- IPC_EXCL
- sorgt im Verbund mit IPC_CREAT für eine
Fehlermeldung, falls das Segment bereits existiert.
- mode_flags
- (niederwertigste 9 Bits) geben die Rechte des Besitzers,
der Gruppe und dem Rest der Welt an. Diese Bits haben das gleiche Format
und die gleiche Bedeutung wie das Argument mode von open(2).
Zurzeit werden die Ausführungsrechte nicht vom System benutzt.
- SHM_HUGETLB (seit Linux 2.6)
- Das Segment unter Benutzung von »huge pages«
reservieren. Die Kernel-Quelldatei Documentation/vm/hugetlbpage.txt
enthält weitere Informationen.
- SHM_NORESERVE (seit Linux 2.6.15)
- Dieser Schalter dient dem gleichen Zweck wie
dermmap(2)-Schalter MAP_NORESERVE. Reservieren Sie keinen
Auslagerungsspeicher für dieses Segment. Wenn Auslagerungsspeicher
reserviert ist, ist es sicher, dass das Segment verändert werden
kann. Wenn kein Auslagerungsspeicher reserviert ist, könnte
SIGSEGV beim Schreiben empfangen werden, falls kein physischer
Speicher verfügbar ist. Siehe auch die Diskussion der Datei
/proc/sys/vm/overcommit_memory in proc(5).
Wenn ein neues gemeinsames Speichersegment erstellt wird, wird sein Inhalt mit
Nullwerten initialisiert und die damit verbundene Datenstruktur
shmid_ds (siehe
shmctl(2)) wie folgt initialisiert:
- shm_perm.cuid und shm_perm.uid werden auf die
effektive Benutzer-ID des aufrufenden Prozesses gesetzt.
- shm_perm.cgid und shm_perm.gid werden auf die
effektive Gruppen-ID des aufrufenden Prozesses gesetzt.
- Die niederwertigsten 9 Bit von shm_perm.mode werden
auf die niederwertigsten 9 Bit von shmflg gesetzt.
- shm_segsz wird auf den Wert von groesse
gesetzt.
- shm_lpid, shm_nattch, shm_atime und
shm_dtime werden auf 0 gesetzt.
- shm_ctime wird auf die aktuelle Zeit gesetzt.
Wenn das gemeinsame Speichersegment bereits existiert, werden die Zugriffsrechte
überprüft und nachgesehen, ob es für die Freigabe markiert
wurde.
RÜCKGABEWERT¶
Bei Erfolg wird ein gültiger Segment-Bezeichner,
shmid,
zurückgegeben, bei Auftreten eines Fehlers -1.
FEHLER¶
Bei Auftreten eines Fehlers enthält
errno einen der folgenden Werte:
- EACCES
- Der Benutzer hat keine Zugriffsrechte auf das gemeinsame
Speichersegment und keine CAP_IPC_OWNER-Fähigkeit.
- EEXIST
- IPC_CREAT | IPC_EXCL wurde angegeben und das Segment
existiert.
- EINVAL
- Es sollte ein neues Segment erstellt werden und
groesse < SHMMIN oder groesse > SHMMAX
oder es sollte kein neues Segment erstellt werden, ein Segment mit
gegebenem Schlüssel exisitierte, aber groesse ist
größer als die Größe dieses Segments.
- ENFILE
- Die Systembeschränkung für die Gesamtzahl offener
Dateien wurde erreicht.
- ENOENT
- Für den angegebenen schluessel exisitert kein
Segment und IPC_CREAT wurde nicht angegeben.
- ENOMEM
- Es konnte kein Speicher für Segment-Zuschlag
reserviert werden.
- ENOSPC
- Alle möglichen gemeinsamen Speicher-IDs wurden in
Anspruch genommen ( SHMMNI) oder das Reservieren eines Segments der
Größe groesse würde dazu führen, dass die
systemweite Begrenzung für gemeinsamen Speicher ( SHMALL)
überschritten wird.
- EPERM
- Der Schalter SHM_HUGETLB wurde angegeben, der
Aufrufende war aber nicht privilegiert (hatte nicht die Fähigkeit
CAP_IPC_LOCK).
SVr4, POSIX.1-2001.
SHM_HUGETLB ist eine nicht portierbare Linux-Erweiterung.
ANMERKUNGEN¶
Das Einbinden von
<sys/types.h> und
<sys/ipc.h> ist
nicht auf Linux oder in irgendeiner Version von POSIX erforderlich. Einige
alte Implementierungen benötigten das Einbinden dieser Header-Dateien und
das SVID dokumentiert ihr Einbinden ebenfalls. Anwendungen, die auf solche
alten Systeme portierbar sein sollen, könnten das Einbinden dieser
Header-Dateien erfordern.
IPC_PRIVATE ist kein Schalterfeld, aber ein
key_t-Typ. Wenn dieser
spezielle Wert für
schalter verwandt wird, ignoriert der
Systemaufruf alles bis auf die niederwertigsten 9 Bit von
shmflg und
erstellt (bei Erfolg) ein neues gemeinsames Speichersegment.
Es gelten die folgenden Einschränkungen für die Ressourcen gemeinsamer
Speichersegmente, die einen
shmget()-Aufruf betreffen:
- SHMALL
- systemweiter Maximalwert für gemeinsame Speicherseiten
(auf Linux kann diese Einschränkung über
/proc/sys/kernel/shmall gelesen und verändert werden).
- SHMMAX
- Maximalgröße eines gemeinsamen Speichersegments
in Byte: abhängig vom Regelwerk. (Auf Linux kann diese
Einschränkung über /proc/sys/kernel/shmax gelesen und
verändert werden.)
- SHMMIN
- Minimalgröße eines gemeinsamen Speichersegments
in Byte: abhängig vom der Implementierung (momentan 1 Byte, obwohl
PAGE_SIZE die effektive Minimalgröße darstellt).
- SHMMNI
- systemweite maximale Anzahl von gemeinsamen
Speichersegmenten: abhängig von der Implementierung (derzeit 4096,
war 128 vor Linux 2.3.99; auf Linux kann diese Einschränkung
über /proc/sys/kernel/shmmni gelesen und verändert
werden).
Die Implementierung hat keine besonderen Einschränkungen für die
maximale Anzahl gemeinsamer Speichersegmente pro Prozess (
SHMSEG).
Linux-Anmerkungen¶
Bis Version 2.3.30 gab Linux
EIDRM für ein
shmget() auf einem
gemeinsamen Speichersegment zurück, das zur Löschung vorgesehen war.
FEHLER¶
Die Wahl des Namens
IPC_PRIVATE war vielleicht unglücklich.
IPC_NEW wäre für diese Funktion besser gewesen.
SIEHE AUCH¶
shmat(2),
shmctl(2),
shmdt(2),
ftok(3),
capabilities(7),
shm_overview(7),
svipc(7)
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler
gemeldet werden können, finden sich unter
http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Ralf Demmer
<rdemmer@rdemmer.de> und Chris Leick <c.leick@vollbio.de>
erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public
License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird
KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.