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