Provided by: manpages-pl-dev_0.5-1_all bug

NAZWA

       shmat, shmdt - operacje na segmentach pamięci dzielonej Systemu V

SKŁADNIA

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

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

       int shmdt(const void *shmaddr);

OPIS

       shmat()  dołącza  segment  pamięci  dzielonej  Systemu  V  identyfikowany  przez  shmid do
       przestrzeni adresowej procesu, który ją wywołał. Adres, pod którym segment ma być widoczny
       jest  przekazywany  w  parametrze  shmaddr,  przy czym system może przetworzyć ten adres w
       następujący sposób:

       Jeśli shmaddr jest równy NULL, to system sam wybierze odpowiedni (nieużywany)  adres,  pod
       którym segment będzie widoczny.

       Jeśli  shmaddr  jest  różny od NULL i w shmflg przekazany został znacznik SHM_RND, wówczas
       segment zostanie dołączony pod  adresem  shmaddr  zaokrąglonym  w  dół  do  wielokrotności
       SHMLBA.  W  innym  przypadku  shmaddr  musi  być wyrównanym do granicy strony adresem, pod
       którym nastąpi dołączenie segmentu.

       Jeśli  w  shmflg  przekazany  zostanie  znacznik  SHM_RDONLY,  wówczas  segment   zostanie
       odwzorowany  z  zabezpieczeniem  przed  zapisem. Proces wywołujący musi mieć prawa odczytu
       segmentu. W przeciwnym razie w dołączanym segmencie  możliwe  są  zarówno  odczyt,  jak  i
       zapis, przy czym proces musi mieć prawa do odczytu i zapisu segmentu. Nie istnieje pojęcie
       segmentu pamięci dzielonej tylko do zapisu.

       Znacznik (specyficzny dla Linuksa) SHM_REMAP  może zostać przekazany w shmflg  i  oznacza,
       że   odwzorowanie   tego  segmentu  powinno  zastąpić  jakiekolwiek  istniejące  wcześniej
       odwzorowanie w zakresie rozpoczynającym się od shmaddr  i  rozciągającym  się  na  rozmiar
       segmentu.  (Normalnie,  gdy  odwzorowanie  w  tym  zakresie adresów już istnieje, powinien
       wystąpić błąd EINVAL). W tym przypadku shmaddr nie może być równy NULL.

       Wartość brk(2) procesu  wywołującego  nie  jest  zmieniana  podczas  dołączania  segmentu.
       Segment  zostanie  automatycznie  odłączony, gdy proces się zakończy. Ten sam segment może
       być dołączony do przestrzeni adresowej procesu jako "tylko do odczytu" lub "do  odczytu  i
       zapisu" więcej niż raz.

       Pomyślne  wywołanie shmdt aktualizuje pola struktury shmid_ds (patrz shmctl(2)) opisującej
       segment w następujący sposób:

              shm_atime przypisywany jest bieżący czas.

              shm_lpid jest ustawiane na identyfikator procesu wywołującego.

              shm_nattch jest zwiększane o jeden.

       shmdt odłącza segment pamięci dzielonej  odwzorowany  pod  adresem  podanym  w  shmaddr  z
       przestrzeni  adresowej  procesu  wywołującego  tę funkcję. Przekazany funkcji w parametrze
       shmaddr adres musi być równy adresowi zwróconemu wcześniej przez wywołanie shmat().

       Pomyślne  wywołanie  shmdt  aktualizuje  pola  struktury  shmid_ds  opisującej  segment  w
       następujący sposób:

              shm_dtime przypisywany jest bieżący czas.

              shm_lpid jest ustawiane na identyfikator procesu wywołującego.

              shm_nattch  jest  zmniejszane  o  jeden.  Jeśli  pole  to osiągnie 0 i segment jest
              zaznaczony do usunięcia, wówczas zostanie on usunięty.

       W wyniku wywołania fork(2) proces potomny dziedziczy dołączone segmenty pamięci dzielonej.

       Po wykonaniu exec(2) wszystkie  dołączone  segmenty  pamięci  dzielonej  są  odłączane  od
       procesu.

       Po  wykonaniu  _exit(2)  wszystkie  dołączone  segmenty  pamięci dzielonej są odłączane od
       procesu.

WARTOŚĆ ZWRACANA

       Jeśli się powiedzie, shmat() zwraca adres dołączonego segmentu pamięci dzielonej; w  razie
       błędu zwracane jest (void *) -1, a zmienna errno wskazuje na przyczynę błędu.

       Jeśli  się  powiedzie,  shmdt()  zwraca 0; w razie błędu zwracane jest -1, a zmienna errno
       wskazuje na przyczynę błędu.

BŁĘDY

       Gdy  shmat()  zakończy  się  niepomyślnie,  zmiennej  errno  przypisywana  jest  jedna   z
       następujących wartości:

       EACCES Proces  wywołujący nie ma wystarczających uprawnień do dołączenia segmentu w żądany
              sposób oraz nie ma ustawionego atrybutu CAP_IPC_OWNER.

       EIDRM  shmid wskazuje na usunięty identyfikator.

       EINVAL Niewłaściwa wartość parametru shmid, niewyrównana (do granicy strony i  nie  podano
              SHM_RND)  lub  niepoprawna  wartość  shmaddr  albo  nieudane dołączenie pod adresem
              shmaddr lub został podany znacznik SHM_REMAP, podczas gdy shmaddr było równe NULL.

       ENOMEM Brak pamięci na deskryptor lub tablice stron.

       Gdy  shmdt()  zakończy  się  niepomyślnie,  zmiennej  errno  przypisywana  jest  jedna   z
       następujących wartości:

       EINVAL Żaden segment pamięci dzielonej nie jest podłączony pod adresem shmaddr lub shmaddr
              nie jest wyrównany do granicy strony.

ZGODNE Z

       SVr4, POSIX.1-2001.

       W SVID 3 (lub być może wcześniejszym) typ parametru shmaddr został 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 *).

UWAGI

       Używanie shmat() z shmaddr  równym  NULL  jest  zalecaną  i  przenośną  metodą  dołączania
       segmentu  pamięci dzielonej. Trzeba jednak być świadomym, że ta metoda dołączania segmentu
       pamięci  dzielonej  może  spowodować  jego  dołączenie  pod  różnymi  adresami  w  różnych
       procesach.   W związku z tym wszystkie wskaźniki obsługiwane w pamięci dzielonej muszą być
       względne (zazwyczaj względem adresu początkowego segmentu), nie zaś bezwzględne.

       Linux pozwala na dołączenie segmentu pamięci dzielonej, nawet jeśli już został  zaznaczony
       do  usunięcia.  Jednakże  POSIX.1-2001  nie  określa  takiego  zachowania  i  wiele innych
       implementacji go nie obsługuje.

       Na wywołanie shmat() wpływa następujący parametr systemowy:

       SHMLBA Wielokrotność adresu dolnej granicy segmentu. Musi być wyrównana do granicy strony.
              W obecnej implementacji SHMLBA jest równe PAGE_SIZE.

       Aktualna  implementacja  nie  ma  wewnętrznego  ograniczenia  na  liczbę segmentów pamięci
       dzielonej dołączanych do jednego procesu (SHMSEG).

ZOBACZ TAKŻE

       brk(2), mmap(2), shmctl(2), shmget(2), capabilities(7), shm_overview(7), svipc(7)

O STRONIE

       Angielska wersja tej strony  pochodzi  z  wydania  3.52  projektu  Linux  man-pages.  Opis
       projektu   oraz   informacje   dotyczące  zgłaszania  błędów  można  znaleźć  pod  adresem
       http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Rafał  Lewczuk  (PTM)
       <R.Lewczuk@elka.pw.edu.p>,  Andrzej  Krzysztofowicz  (PTM)  <ankry@mif.pg.gda.pl>,  Robert
       Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

       Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów  na
       stronie   http://sourceforge.net/projects/manpages-pl/.   Jest   zgodne   z  wersją   3.52
       oryginału.