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