shmop

Autres langues

Langue: pl

Autres versions - même langue

Version: 2002-01-05 (openSuse - 09/10/07)

Section: 2 (Appels système)

NAZWA

shmop - operacje na segmentach pamiêci wspólnej

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

Funkcja shmat do³±cza segment pamiêci wspólnej o deskryptorze shmid do przestrzeni adresowej procesu, który j± wywo³a³. Adres, pod którym segment ma byæ widoczny jest przekazywany parametrem shmaddr, przy czym system mo¿e przetworzyæ ten adres w nastêpuj±cy sposób:

Je¶li shmaddr jest równy NULL, wówczas system sam wybierze odpowiedni (nieu¿ywany) adres, pod którym segment bêdzie widoczny.

Je¶li shmaddr nie jest równy 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 razie 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 shmat 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 wspólnej tylko do zapisu.

Znacznik (specyficzny dla Linuksa) SHM_REMAP, który mo¿e zostaæ przekazany w shmflg 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 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 byc równe NULL.

Warto¶æ brk procesu wywo³uj±cego funkcjê nie jest zmieniana podczas do³±czania segmentu. Segment zostanie automatycznie od³±czony, gdy proces zakoñczy siê. 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.

W wyniku pomy¶lnego wywo³ania shmat system operacyjny aktualizuje pola struktury shmid_ds opisuj±cej segment w nastêpuj±cy sposób:

shm_atime zostaje przypisany aktualny czas.
shm_lpid zostanie przypisany identyfikator procesu wywo³uj±cego shmat.
shm_nattch zostanie zwiêkszone o jeden.

Nale¿y zwróciæ uwagê, ¿e operacja powiedzie siê nawet je¶li do³±czany segment pamiêci wspólnej jest zaznaczony do usuniêcia.

Funkcja shmdt wy³±cza segment pamiêci wspólnej 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 .

W wyniku pomy¶lnego wywo³ania shmdt pola struktury shmid_ds opisuj±cej segment aktualizowane s± w nastêpuj±cy sposób:

shm_dtime przypisywany jest aktualny czas.
shm_lpid przypisywany jest identyfikator procesu wywo³uj±cego shmdt.
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.

Obszar w przestrzeni adresowej procesu wywo³uj±cego funkcjê jest zwalniany.

WYWO£ANIA SYSTEMOWE

fork()
W wyniku wywo³ania fork() proces potomny dziedziczy do³±czone segmenty pamiêci wspólnej.
exec()
Po wykonaniu exec() wszystkie odwzorowane segmenty s± od³±czane (nie s± usuwane).
exit()
Po wykonaniu exit() wszystkie do³±czone segmenty pamiêci wspólnej s± od³±czane (nie s± usuwane).

WARTO¦Æ ZWRACANA

W przypadku wyst±pienia b³êdu opydwie funkcje zwracaj± -1 przypisuj±c zmiennej errno kod b³êdu. W wyniku poprawnego wykonania funkcja shmat zwraca adres pocz±tku obszaru odwzorowania segmentu, natomiast funkcja shmdt zwraca warto¶æ 0.

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 funkcjê nie ma uprawnieñ do do³±czenia segmentu w zadany sposób (do odczytu lub odczytu / zapisu).
EINVAL
Niew³a¶ciwa warto¶æ parametru shmid, niewyrównana do granicy strony (i nie podano SHM_RND), niepoprawna warto¶æ shmaddr, nieudane do³±czenie pod adresem brk lub zosta³ podany znacznik SHM_REMAP, podczas gdy shmaddr jest równe NULL.
ENOMEM
Brak pamiêci na deskryptor lub tablice stron.

Funkcja shmdt mo¿e zakoñczyæ siê niepomy¶lnie tylko w sytuacji, gdy pod adresem shmaddr nie istnieje segment pamiêci wspólnej. Wowczas zmienna errno przyjmie warto¶æ EINVAL.

UWAGI

U¿ywanie shmat z shmaddr równym NULL jest zalecan±, przeno¶n± motod± do³±czania segmentu pamiêci wspólnej. Trzeba jednak byæ ¶wiadomym, ¿e ta metoda do³±czania segmentu pamiêci wspólnej 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 wspólnej musz± byæ wzglêdne (zazwyczaj wzglêdem adresu pocz±tkowego segmentu), nie za¶ bezwzglêdne.

Dla wywo³ania shmat obowi±zuje nastêpuj±ce ograniczenie systemowe:

SHMLBA
Warto¶æ, której wielokrotno¶ci± musi byæ adres dolnej granicy segmentu. Musi byæ wyrównana do granicy strony. W aktualnej implementacji SHMLBA jest równe PAGE_SIZE.

Aktualna implementacja nie ma wewnêtrznego ograniczenia na ilo¶æ segmentów pamiêci wspólnej do³±czanych do jednego procesu (SHMSEG).

ZGODNE Z

SVr4, SVID. SVr4 dokumentuje dodatkowy kod b³êdu EMFILE. W SVID-v4 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 *.)

ZOBACZ TAK¯E

brk(2), ipc(5), mmap(2), shmctl(2), shmget(2).