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

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.
Linux 2013-02-12 SHMOP(2)