Provided by: manpages-pl-dev_20060617-3_all bug

NAZWA

       shmget - utworzenie segmentu pamici wspolnej

SK/LADNIA

       #include <sys/ipc.h>

       #include <sys/shm.h>

       int shmget(key_t key, int size, int shmflg);

OPIS

       Funkcja   shmget()   zwraca   deskryptor   segmentu   pamici  wspolnej,
       skojarzonego z wartoci (kluczem)  przekazan  w  parametrze  key.   Nowy
       segment   zostanie   utworzony,  Jeli  parametr  key  bdzie  mie  warto
       IPC_PRIVATE lub jeli bdzie mie inn warto, a segment  skojarzony  z  key
       nie  istnieje  za  w  parametrze  shmflg  zostanie  przekazany znacznik
       IPC_CREAT  (tj.   shmflg&IPC_CREAT  nie  jest  rowne  0),  to  zostanie
       utworzony  nowy  segment,  a  jego rozmiar bdzie rowny parametrowi size
       zaokrglonemu w gor do wielokrotnoci PAGE_SIZE.

       Warto shmflg sklda si z:

       IPC_CREAT,  aby utworzy nowy segment. Jeli ten znaczniek  nie  zostanie
                   ustawiony,  to shmget() sprobuje znale segment skojarzony z
                   key i sprzwdzi, czy uytkownik ma uprawnienia dla dostpu  do
                   segmentu.

       IPC_EXCL    przekazane  lcznie  z  IPC_CREAT zapewnia sygnalizacj bldu,
                   jeli segment ju isnieje.

       mode_flags (9 najmniej znaczcych bit'ow)
                   okrela prawa dostpu do segmentu dla jego wlaciciela,  grupy
                   oraz  reszty  wiata. Prawa uruchamiania nie s obecnie przez
                   system uywane.

       W momencie tworzenia segmentu, prawa dostpu  s  kopiowane  z  parametru
       shmflg do pola shm_perm definiujcej segment struktury shmid_ds.  Budowa
       struktury shmid_ds:

            struct shmid_ds {
                struct ipc_perm shm_perm;    /* prawa dostpu */
                int               shm_segsz;   /* rozmiar segmentu (w bajtach) */
                time_t         shm_atime;   /* czas ostatniego dolczenia */
                time_t         shm_dtime;   /* czas ostatniego odlczenia */
                time_t         shm_ctime;   /* czas ostatniej modyfikacji */
                unsigned short  shm_cpid;    /* PID tworcy segmentu */
                unsigned short  shm_lpid;    /* PID ostatniego operujcego procesu */
                short     shm_nattch;      /* aktualna liczba dolcze */
            };

            struct ipc_perm {
                key_t  key;
                ushort uid;   /* euid i egid wlaciciela*/
                ushort gid;
                ushort cuid;  /* euid i egid tworcy */
                ushort cgid;
                ushort mode;  /* 9 najmniej znaczcych bitow shmflg */
                ushort seq;   /* numer porzdkowy */
            };

       Podczas tworzenia segmentu  pamici  wsolnej,  funkcja  ta  inicjalizuje
       struktur shmid_ds w nastpujcy sposob:

              shm_perm.cuid   i   shm_perm.uid   przypisywany  jest  efektywny
              identyfikator uytkownika procesu, ktory wywolal shmget.

              shm_perm.cgid  i  shm_perm.gid   przypisywany   jest   efektywny
              identyfikator grupy procesu, ktory wywolal shmget.

              9  najmniej znaczcych bitow parametru shmflg jest kopiowanych do
              pola shm_perm.mode.

              shm_segsz przypisywana jest warto parametru size.

              Polom shm_lpid, shm_nattch, shm_atime i  shm_dtime  przypisywana
              jest warto 0.

              Polu shm_ctime przypisywany jest aktualny czas.

       Jeli  dany segment pamici wspolnej ju istnieje, wowczas system sprawdza
       prawa dostpu oraz bada, czy segment nie zostal zaznaczony do usunicia.

WYWO/LANIA SYSTEMOWE

       fork() Po wywolaniu fork() proces potomny dziedziczy dolczone  segmenty
              pamici wspolnej.

       exec() Po  wywolaniu exec() wszystkie dolczone segmenty s odlczane (nie
              s usuwane).

       exit() Podczas  wywolywania  exit()  wszystkie  dolczone   segmenty   s
              odlczane (nie s usuwane).

WARTO ZWRACANA

       Funkcja  po  pomylnym zakoczeniu zwraca deskryptor segmentu, a -1, jeli
       wystpi bld.

B/LDY

       W przypadku wystpienia bldu, zmiennej errno przypisywana jest  jedna  z
       nastpujcych wartoci:

       EINVAL,     jeli mial zosta utworzony nowy segment, a size < SHMMIN lub
                   size > SHMMAX, lub gdy nie mial by utworzony nowy  segment,
                   a  segment  o  podanej wartoci key istnieje, lecz size jest
                   wiksze ni rozmiar tego segmentu.

       EEXIST,     jeli przekazane zostaly znaczniki IPC_CREAT  |  IPC_EXCL  ,
                   ale segment o zadanym kluczu ju istnieje.

       EIDRM       jeli segment zostal zaznaczony do usunicia lub usunity.

       ENOSPC      jeli  przekroczony  zostal  limit  iloci  segmentow  pamici
                   wspolnej  w  systemie  (SHMMNI)  lub  sumarycznej  wielkoci
                   wszystkich segmentow (SHMALL).

       ENOENT,     jeli  segment  o  zadanej  wartoci  key nie istnieje, a nie
                   ustawiono znacznika IPC_CREAT.

       EACCES,     jeli uytkownik nie ma  praw  dostpu  do  zadanego  segmentu
                   pamici wspolnej.

       ENOMEM,     gdy nie uda si przydzieli pamici dla segmentu.

UWAGI

       IPC_PRIVATE  nie  jest znacznikiem, lecz wartoci typu key_t.  Jeli jako
       key zostanie uyta ta warto specjalna,  to  funkcja  zignoruje  wszystko
       oprocz  9 najmniej znaczcych bitow shmflg i utworzy nowy segment pamici
       wspolnej nie posiadajcy klucza (jeli wywolanie zakoczy si pomylnie).

       Nastpujce ograniczenia odnoszce si do zasobow  pamici  wspolnej  dotycz
       funkcji shmget:

       SHMALL     Maksymalna   liczba   stron   pamici  uytych  do  stworzenia
                  segmentow pamici wspolnej: zalena od polityki.

       SHMMAX     Maksymalny rozmiar (w bajtach) pojedynczego segmentu  pamici
                  wspolnej: zaleny od implementacji (aktualnie 4MB).

       SHMMIN     Minimalny  rozmiar  (w bajtach) pojedynczego segmentu pamici
                  wspolnej: zaleny od implementacji  (aktualnie  1  bajt,  ale
                  efektywny minimalny rozmiar wynosi PAGE_SIZE ).

       SHMMNI     Maksymalna  liczba  segmentow  pamici  wspolnej  w systemie:
                  zalena od implementacji  (aktualnie  4096,  ale  w  wersjach
                  Linuksa wczeniejszych ni 2.3.99 wynosila 128)

       System Linux nie stawia ogranicze dotyczcych iloci segmentow dolczonych
       do jednego procesu (SHMSEG).

USTERKI

       Wybrana nazwa,  IPC_PRIVATE,  prawdopodobnie  nie  jest  najszczliwsza.
       IPC_NEW  w  sposob  bardziej  przejrzysty  odzwierciedlalo  by  rol tej
       wartoci.

ZGODNE Z

       SVr4, SVID. SVr4 dokumentuje dodatkowy  kod  bldu  EEXIST.   Do  wersji
       2.3.30  Linux  zwracal  EIDRM w przepadku wywolania shmget na segmencie
       pamici wspolnej przeznaczonym do skasowania.

ZOBACZ TAKE

       ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2)

INFORMACJE O T/LUMACZENIU

       Powysze tlumaczenie pochodzi z nieistniejcego ju  Projektu  Tlumaczenia
       Manuali  i  moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
       opisem a rzeczywistym zachowaniem  opisywanego  programu  lub  funkcji,
       prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.