SHMOP(2) | Podręcznik programisty Linuksa | SHMOP(2) |
shmat, shmdt - operacje na segmentach pamięci dzielonej Systemu V
#include <sys/types.h> #include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg); int shmdt(const void *shmaddr);
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:
Oprócz SHM_RND można określić następujące flagi w argumencie maski bitowej shmflg:
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:
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:
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.
Gdy shmat() zakończy się niepomyślnie, zmiennej errno przypisywana jest jedna z następujących wartości:
Gdy shmdt() zakończy się niepomyślnie, zmiennej errno przypisywana jest jedna z następujących wartości:
POSIX.1-2001, POSIX.1-2008, SVr4.
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 *.
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.
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 nie określa takiego zachowania i wiele innych implementacji go nie obsługuje.
Na wywołanie shmat() wpływa następujący parametr systemowy:
Aktualna implementacja nie ma wewnętrznego ograniczenia na liczbę segmentów pamięci dzielonej dołączanych do jednego procesu (SHMSEG).
brk(2), mmap(2), shmctl(2), shmget(2), capabilities(7), shm_overview(7), svipc(7)
Angielska wersja tej strony pochodzi z wydania 4.07 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.
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ą 4.07 oryginału.
2015-08-08 | Linux |