Provided by:
manpages-de-dev_0.5-4.1ubuntu1_all 
BEZEICHNUNG
shmget - weist ein gemeinsames Speichersegment zu
ÜBERSICHT
#include <sys/ipc.h>
#include <sys/shm.h>
intshmget(key_tkey,intsize,intshmflg);
BESCHREIBUNG
shmget() gibt den Identifikator des gemeinsamen Speichersegments
zurück, der dem Wert des Arguments key zugewiesen ist. Ein neues
gemeinsames Speichersegment mit der um size auf ein mehrfaches von
PAGE_SIZE aufgerundeten Größe wird nur dann erstellt, key den Wert
IPC_PRIVATE hat oder key nicht IPC_PRIVATE ist, sonst wird dem Wert key
kein gemeinsames Speichersegment zugeordnet, und IPC_CREAT im shmflg
wird gesetzt (d.h. shmflg&IPC_CREAT ergibt nicht NULL). The presence
in
shmflg besteht aus:
IPC_CREAT für das Erstellen eines neuen Segments. Wenn dieses Flag
nicht belegt wird, sucht shmget() das key zugeordnete
Segment, prüft, ob der Benutzer die nötigen Rechte besitzt,
um die dem Segment zugeordnete shmid zu erhalten und stellt
sicher, dass das Segment nicht zum Löschen markiert ist.
IPC_EXCL sorgt im Verbund mit IPC_CREAT für eine Fehlermeldung,
falls das Segment bereits existiert.
mode_flags (untere 9 Bit)
legt die Rechte für den Eigentümer, die Benutzergruppe und
den Rest der Welt fest. Zurzeit werden die
Ausführungsrechte vom System nicht verwendet.
Wenn ein neues Segment erstellt wird, werden die Zugriffsrechte von
shmflg in den shm_perm -Teil des shmid_ds -Struktur kopiert, die das
Segment definiert. Die shmid_ds-Struktur:
struct shmid_ds {
struct ipc_perm shm_perm; /* Rechte */
int shm_segsz; /* Größe des Segments in Byte */
time_t shm_atime; /* letzte Anhangszeitpunkt */
time_t shm_dtime; /* letzter Entkopplungszeitpunkt */
time_t shm_ctime; /* letzter Änderungszeitpunkt */
unsigned short shm_cpid; /* PID des Erzeugers */
unsigned short shm_lpid; /* PID des letzten Operators */
short shm_nattch; /* Anzahl der momentanen Anhänge */
};
struct ipc_perm
{
key_t key;
ushort uid; /* Besitzer-euid und egid */
ushort gid;
ushort cuid; /* Erzeuger-euid und egid */
ushort cgid;
ushort mode; /* untere 9 Bit von shmflg */
ushort seq; /* Folgenummer */
};
Im weiteren initialisiert der Systemaufruf beim Erstellen die
Systemdatenstruktur des gemeinsamen Speichersegments shmid_ds wie
folgt:
shm_perm.cuid und shm_perm.uid werden mit den tatsächliche
Benutzer-ID des aufrufenden Prozesses belegt.
shm_perm.cgid und shm_perm.gid werden mit den tatsächliche
Gruppen-ID des aufrufenden Prozesses belegt.
Die niederwertigsten 9 Bit von shm_perm.mode werden den
niederwertigsten 9 Bit von shmflg gleichgesetzt.
shm_segsz wird mit dem Wert von size.
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 verglichen und überprüft, ob es zum Löschen freigegeben
(bzw. markiert) wurde.
SYSTEM CALLS
fork() Nach einem fork() erbt der Kind-Prozess das angehängte
gemeinsame Speichersegment.
exec() Nach einem exec() sind alle angehängten gemeinsamen
Speichersegmente entkoppelt (nicht zerstört).
exit() Nach einem exit() sind alle angehängten gemeinsamen
Speichersegmente entkoppelt (nicht zerstört).
RÜCKGABEWERT
Bei Erfolg wird ein gültiger Segment-Identifier zurückgegeben: shmid,
bei Auftreten eines Fehlers -1.
FEHLER
Bei Auftreten eines Fehlers enthält errno einen der folgenden Werte:
EINVAL wird zurückgegeben, wenn SHMMIN > size oder size > SHMMAX
oder, wenn size größer als die Segmentgröße ist.
EEXIST wird zurückgegeben, wenn IPC_CREAT | IPC_EXCL angegeben
wurde und das Segment existiert.
EIDRM wird zurückgegeben, wenn das Segment als zerstört markiert
oder entfernt wurde.
ENOSPC wird zurückgegeben, wenn alle möglichen IDs für gemeinsame
Speichersegmente (SHMMNI) angenommen haben oder ein Segment
der angeforderten Größe zu einer Überschreitung der
systemweiten Speichergrenze für gemeinsame Speichersegmente
führen würde. (SHMALL).
ENOENT wird zurückgegeben, wenn für den angegebenen key kein
Segment existiert und IPC_CREAT nicht angegeben wurde.
EACCES wird zurückgegeben, wenn der Benutzer keine Zugriffsrechte
auf das gemeinsame Speichersegment besitzt.
ENOMEM wird zurückgegeben, wenn kein Speicher für den Segment-
Overhead bereitgestellt werden konnte.
ANMERKUNGEN
IPC_PRIVATE ist kein Flag-Feld, sondern vom Typ key_t . Wenn dieser
spezielle Wert für key, verwendet wird, ignoriert der Systemaufruf
alles bis auf die unteren 9 Bit von shmflg und erstellt bei Erfolg ein
neues gemeinsames Speichersegment.
Es gelten die folgenden Einschränkungen auf die Ressourven gemeinsamer
Speichersegmente, die einen shmget -Aufruf betreffen:
SHMALL Systemweiter Maximalwert für gemeinsam genutzte
Speicherblöcke: abhängig von der Politik.
SHMMAX Maximalgröße eines gemeinsamen Speichersegments in Byte:
abhängig von der jeweiligen Umsetzung (momentan bei 4 MB).
SHMMIN Minimalgröße eines gemeinsamen Speichersegments: abhängig
von der jeweiligen Umsetzung (momentan 1 byte, obwohl
PAGE_SIZE die wirkliche Minimalgröße darstellt).
SHMMNI Systemweite maximale Anzahl von gemeinsamen
Speichersegmenten: abhängig von der jeweiligen Umsetzung
(momentan 4096).
Die jeweilige Umsetzung setzt keine Beschrängungen für die maximale
Anzahl von gemeinsamen Speichersegmenten pro Prozess (SHMSEG).
BUGS
Die Verwendung von IPC_PRIVATE unterbindet nicht den Zugriff anderer
Prozesse auf das zugeordnete gemeinsame Speichersegment.
Genau wie für Dateien, gibt es momentan keinen eigenständigen Weg für
einen Prozess den ausschließlichen Zugriff auf ein gemeinsam genutztes
Speichersegment sicherzustellen. Die Zuweisung von IPC_CREAT und
IPC_EXCL zu shmflg garantiert bei Erfolg nur die Erstellung eines neuen
gemeinsamen Speichersegments, nicht aber den ausschließlichen Zugriff
auf das Segment.
KONFORM ZU
SVr4, SVID. Unter SVr4 ist eine weitere Fehlerbedingung EEXIST
dokumentiert. Weder SVr4 noch SVID enthalten eine Dokumentation zu
EIDRM-Bedingungen.
SIEHE AUCH
ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2).