Scroll to navigation

SHMGET(2) Linux-Programmierhandbuch SHMGET(2)

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

KONFORM ZU

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>.
31. Mai 2012 Linux