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

NAZWA

       shmop - operacje na segmentach pamici wspolnej

SK/LADNIA

       #include <sys/types.h>
       #include <sys/shm.h>

       void *shmat(int shmid, const void *shmaddr, int shmflg);

       int shmdt(const void *shmaddr);

OPIS

       Funkcja  shmat  dolcza  segment pamici wspolnej o deskryptorze shmid do
       przestrzeni adresowej procesu, ktory  j  wywolal.   Adres,  pod  ktorym
       segment  ma by widoczny jest przekazywany parametrem shmaddr, przy czym
       system moe przetworzy ten adres w nastpujcy sposob:

       Jeli shmaddr jest rowny NULL, wowczas system  sam  wybierze  odpowiedni
       (nieuywany) adres, pod ktorym segment bdzie widoczny.

       Jeli  shmaddr nie jest rowny NULL i w shmflg przekazany zostal znacznik
       SHM_RND,  wowczas  segment  zostanie  dolczony  pod   adresem   shmaddr
       zaokrglonym  w dol do wielokrotnoci SHMLBA.  W innym razie shmaddr musi
       by wyrownanym do granicy strony adresem, pod  ktorym  nastpi  dolczenie
       segmentu.

       Jeli  w shmflg przekazany zostanie znacznik SHM_RDONLY, wowczas segment
       zostanie odwzorowany z zabezpieczeniem przed zapisem. Proces  wywolujcy
       shmat  musi mie prawa odczytu segmentu.  W przeciwnym razie w dolczanym
       segmencie moliwe s zarowno odczyt, jak i zapis, przy czym  proces  musi
       mie  prawa  do odczytu i zapisu segmentu.  Nie istnieje pojcie segmentu
       pamici wspolnej tylko do zapisu.

       Znacznik  (specyficzny  dla  Linuksa)  SHM_REMAP,   ktory   moe   zosta
       przekazany  w  shmflg  oznacza,  e  odwzorowanie  tego segmentu powinno
       zastpi  jakiekolwiek  istniejce  wczeniej   odwzorowanie   w   zakresie
       rozpoczynajcym  si  od  shmaddr  i  rozcigajcym  na  rozmiar  segmentu.
       (Normalnie, gdy  odwzorowanie  w  tym  zakresie  adresow  ju  istnieje,
       powinien wystpi bld EINVAL.)  W tym przypadku shmaddr nie moe byc rowne
       NULL.

       Warto  brk  procesu  wywolujcego  funkcj  nie  jest  zmieniana  podczas
       dolczania  segmentu.   Segment  zostanie  automatycznie  odlczony,  gdy
       proces zakoczy si.  Ten sam segment  moe  by  dolczony  do  przestrzeni
       adresowej  procesu  jako  "tylko  do odczytu" lub "do odczytu i zapisu"
       wicej ni raz.

       W wyniku pomylnego wywolania shmat system operacyjny  aktualizuje  pola
       struktury shmid_ds opisujcej segment w nastpujcy sposob:

              shm_atime zostaje przypisany aktualny czas.

              shm_lpid  zostanie  przypisany identyfikator procesu wywolujcego
              shmat.

              shm_nattch zostanie zwikszone o jeden.

       Naley zwroci uwag, e operacja powiedzie si nawet jeli dolczany  segment
       pamici wspolnej jest zaznaczony do usunicia.

       Funkcja  shmdt  wylcza  segment pamici wspolnej odwzorowany pod adresem
       podanym w shmaddr z przestrzeni adresowej procesu wywolujcego t funkcj.
       Przekazany  funkcji  w  parametrze shmaddr adres musi by rowny adresowi
       zwroconemu wczeniej przez wywolanie shmat .

       W wyniku pomylnego wywolania shmdt pola  struktury  shmid_ds  opisujcej
       segment aktualizowane s w nastpujcy sposob:

              shm_dtime przypisywany jest aktualny czas.

              shm_lpid  przypisywany  jest  identyfikator  procesu wywolujcego
              shmdt.

              shm_nattch jest zmniejszane o jeden. Jeli pole to  osignie  0  i
              segment   jest  zaznaczony  do  usunicia,  wowczas  zostanie  on
              usunity.

       Obszar  w  przestrzeni  adresowej  procesu  wywolujcego   funkcj   jest
       zwalniany.

WYWO/LANIA SYSTEMOWE

       fork() W  wyniku  wywolania  fork()  proces potomny dziedziczy dolczone
              segmenty pamici wspolnej.

       exec() Po wykonaniu exec() wszystkie odwzorowane  segmenty  s  odlczane
              (nie s usuwane).

       exit() Po  wykonaniu exit() wszystkie dolczone segmenty pamici wspolnej
              s odlczane (nie s usuwane).

WARTO ZWRACANA

       W przypadku wystpienia  bldu  opydwie  funkcje  zwracaj  -1  przypisujc
       zmiennej  errno  kod bldu.  W wyniku poprawnego wykonania funkcja shmat
       zwraca adres pocztku obszaru odwzorowania segmentu,  natomiast  funkcja
       shmdt zwraca warto 0.

B/LDY

       Gdy  shmat  zakoczy  si  niepomylnie,  zmiennej errno przypisywana jest
       jedna z nastpujcych wartoci:

       EACCES     Proces  wywolujcy  funkcj  nie  ma  uprawnie  do   dolczenia
                  segmentu w zadany sposob (do odczytu lub odczytu / zapisu).

       EINVAL     Niewlaciwa  warto  parametru  shmid, niewyrownana do granicy
                  strony (i nie podano SHM_RND),  niepoprawna  warto  shmaddr,
                  nieudane   dolczenie  pod  adresem  brk  lub  zostal  podany
                  znacznik SHM_REMAP, podczas gdy shmaddr jest rowne NULL.

       ENOMEM     Brak pamici na deskryptor lub tablice stron.

       Funkcja shmdt moe zakoczy si niepomylnie  tylko  w  sytuacji,  gdy  pod
       adresem  shmaddr  nie istnieje segment pamici wspolnej. Wowczas zmienna
       errno przyjmie warto EINVAL.

UWAGI

       Uywanie shmat  z  shmaddr  rownym  NULL  jest  zalecan,  przenon  motod
       dolczania  segmentu  pamici  wspolnej.  Trzeba jednak by wiadomym, e ta
       metoda dolczania segmentu pamici wspolnej moe spowodowa jego  dolczenie
       pod  ronymi  adresami  w  ronych  procesach.   W zwizku z tym wszystkie
       wskaniki obslugiwane w  pamici  wspolnej  musz  by  wzgldne  (zazwyczaj
       wzgldem adresu pocztkowego segmentu), nie za bezwzgldne.

       Dla wywolania shmat obowizuje nastpujce ograniczenie systemowe:

       SHMLBA     Warto,  ktorej  wielokrotnoci  musi  by adres dolnej granicy
                  segmentu.  Musi by wyrownana do granicy strony.  W aktualnej
                  implementacji SHMLBA jest rowne PAGE_SIZE.

       Aktualna implementacja nie ma wewntrznego ograniczenia na ilo segmentow
       pamici wspolnej dolczanych do jednego procesu (SHMSEG).

ZGODNE Z

       SVr4, SVID. SVr4 dokumentuje dodatkowy kod bldu EMFILE.  W SVID-v4  typ
       parametru  shmaddr  zostal  zmieniony  z  char * na const void *, a typ
       wyniku zwracanego przez shmat() z char * na void *.  (Linuksowe libc4 i
       libc5 zawieraj prototypy char *; glibc2 zawiera void *.)

ZOBACZ TAKE

       brk(2), ipc(5), mmap(2), shmctl(2), shmget(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.