Provided by: manpages-de-dev_0.5-4.1ubuntu1_all bug

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