Provided by:
manpages-pl-dev_20060617-3_all 
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.