Provided by:
manpages-pl-dev_20060617-3_all 
NAZWA
mmap, munmap - mapowanie lub usunicie mapowania plikow lub urzdze w
pamici
SK/LADNIA
#include <sys/mman.h>
#ifdef _POSIX_MAPPED_FILES
void * mmap(void *start, size_t length, int prot , int flags, int fd,
off_t offset);
int munmap(void *start, size_t length);
#endif
OPIS
Funkcja mmap zleca zamapowanie do pamici, najchtniej pod adres start,
length bajtow pliku (lub innego obiektu) zadanego przez deskryptor fd,
przesunitych wzgldem pocztku o offset. Adres start jest jednak tylko
propozycj i zazwyczaj jest przekazywany jako 0. Rzeczywiste miejsce
zamapowania obiektu jest zwracane przez mmap i nigdy nie jest zerem.
Argument prot opisuje oczekiwany sposow ochrony pamici (i nie moe by
sprzeczny z trybem otwarcia pliku). Moe on by rowny PROT_NONE lub moe
by logicznym OR jednego lub wicej sporod innych znacznikow PROT_*.
PROT_EXEC Strony mog by wykonywane.
PROT_READ Strony mog by odczytywane.
PROT_WRITE Strony mog by zapisywane.
PROT_NONE Strony nie mog by dostpne.
Patametr flags okrela rodzaj mapowanego obiektu, opcje mapowania i czy
modyfikacje na zmapowanej kopii strony s prywatne dla procesu, czy te
powinny by wspoldzielone z innymi odniesieniami. Ma on bity
MAP_FIXED Polecenie nie wybierania innego adresu ni podany. Jeli
podanego adresu nie mona uy, mmap zawiedzie. Jeli podano
MAP_FIXED, start musi by wielokrotnoci rozmiaru strony.
Uywanie tej opcji nie jest zalecane.
MAP_SHARED Polecenie wspoldzielenia mapowania ze wszystkimi innymi
procesami, ktore mapuj ten obiekt. Zapisywanie danych w
danym obszarze bdzie rownowane z zapisywaniem do pliku. Plik
moe w rzeczywistoci nie zosta zaktualizowany a do wywolania
msync(2) lub munmap(2).
MAP_PRIVATE
Polecenie utworzenia prywatnego mapowania, typu "kopiowanie
podczas zapisu". Zapisywanie danych w danym obszarze nie
bdzie wplywa na zawarto oryginalnego pliku. Nie jest
okrelone, czy zmiany zawartoci pliku wykonane po wywolaniu
mmap bd uwidocznione w mapowanym obszarze.
Trzeba poda dokladnie jedno spomidzy MAP_SHARED i MAP_PRIVATE.
Powysze trzy znaczniki s opisane w POSIX.1b (poprzednio POSIX.4) oraz
SUSv2. Linux obslugje dodatkowo nastpujce znaczniki niestandardowe:
MAP_DENYWRITE
Ten znacznik jest ignorowany. (Dawno temu sygnalizowal on, e
proba zapisu to mapowanego pliku powinna zawie z ETXTBUSY. Ale
bylo to rodlem atakow blokujcych uslug (DoS).)
MAP_EXECUTABLE
Ten znacznik jest ignorowany.
MAP_NORESERVE
(Uywany lcznie z MAP_PRIVATE.) Poleca nie rezerwowa stron
przestrzeni wymiany dla tego mapowania. Gdy przestrze wymiany
jest zarezerwowana, ma si gwarancj, e istnieje moliwo
modyfikacji tego prywatnego "kopiowanego podczas zapisu"
obszaru. Gdy nie jest ona zarezerwowana, mona otrzyma SIGSEGV
podczas zapisu, jeeli braknie pamici.
MAP_LOCKED
Ten znacznik jest ignorowany.
MAP_GROWSDOWN
Uywany do stosow. Sygnalizuje systemowi zarzdzania pamici
wirtualn w jdrze, e to mapowanie powinno by rozszerzane w pamici
w dol.
MAP_ANONYMOUS
Mapowanie nie jest oparte na adnym pliku; argumenty fd i offset
zostan zignorowane. Ten znacznik w polczeniu z MAP_SHARED jest
zaimplementowany w Linuksie poczwszy od 2.4.
MAP_ANON
Alias dla MAP_ANONYMOUS. Porzucony.
MAP_FILE
Znacznik slucy zgodnoci. Ignorowany.
MAP_32BIT
Umieszczenie mapowania w pierwszych 2GB przestrzeni adresowej
procesu. Ignorowany gdy ustawiony jest MAP_FIXED. Znacznik ten
jest obecnie wspierany jedynie przez 64-bitowe programy na
architekturze x86-64.
Niektore systemy dokumentuj dodatkowe znaczniki MAP_AUTOGROW,
MAP_AUTORESRV, MAP_COPY i MAP_LOCAL.
fd powinno by prawidlowowym deskryptorem pliku; jeeli ustawiono
MAP_ANONYMOUS, to argument ten jest ignorowany.
offset powinno by wielokrotnoci rozmiaru strony zwracanego przez
getpagesize(2).
Pami zamapowana za pomoc mmap jest zachowywana poprzez fork(2) z tymi
samymi atrybutami.
Plik jest mapowany w wielokrotnociah rozmiaru strony. Dla plikow, ktore
nie s wielokrotnociami rozmiaru strony, pozostala pami jest zerowana
podczas mapowania, a zapisy do tego obszaru nie s zapisywane w pliku.
Efektem zmiany rozmiaru zamapowanego pliku na zamapowane strony, ktore
odpowiadaj dodanym lub usunitym obszarom pliku, jest nieokrelony.
Funkcja systemowa munmap usuwa mapowanie z podanego zakresu adresow i
powoduje, e dalsze odwolania do adresow z tego zakresu bd generowa
nieprawidlowe odwolania do pamici. Mapowanie obszaru jest rownie
automatycznie usuwane, gdy proces si zakoczy. Z drugiej strony,
zamknicie deskryptora pliku nie usuwa mapowania obszaru.
Adres start musi by wielokrotnoci rozmiaru strony. Usuwane jest
mapowanie wszystkich stron zawierajcych fragmenty ze wskazanego
zakresu, wszystkie poniejsze odwolania do tych stron wygeneruj SIGSEGV.
Nie jest bldem, gdy brak w podanym zakresie zamapowanych stron.
Dla mapowa opartych na plikach pole st_atime zamapowanego pliku moe
zosta zaktualizowane w dowolnym momencie pomidzy mmap() i usuniciem
odpowiedniego mapowania; pierwsze odwolanie do zamapowanej strony
spowoduje zaktualizowanie tego pola, jeli nie stalo si to wczeniej.
Pola st_ctime i st_mtime pliku zamapowanego z PROT_WRITE i MAP_SHARED
zostanie zaktualizowane po zapisie do mapowanego obszaru, a przed
poniejszym wywolaniem msync() ze znacznikiem MS_SYNC lub MS_ASYNC, jeli
taki wywolanie wystpi.
WARTO ZWRACANA
Po pomylnym zakoczeniu B mmap zwraca wskanik do mapowanego obszaru. Po
bldzie zwracane jest MAP_FAILED (-1) i odpowiednio ustawiane jest
errno. Po pomylnym zakoczeniu munmap zwraca 0, a po bldzie -1 i
ustawia errno (prawdopodobnie na EINVAL).
UWAGI
To, czy PROT_READ zawiera PROT_EXEC, czy nie, zaley od architektury. W
przenonych programach naley zawsze ustawia PROT_EXEC, gdy planowane
jest uruchamianie przez nie kodu w nowym mapowaniu.
B/LDY
EBADF fd nie jest prawidlowym deskryptorem pliku (a nie ustawiono
MAP_ANONYMOUS).
EACCES Deskryptor pliku nie odnosi si do zwyklego pliku. Lub zgloszono
MAP_PRIVATE, lecz fd nie jest otwarty dla odczytu. Lub
zgloszono MAP_SHARED i ustawiono PROT_WRITE, a fd nie jest
otwarte w trybie odczytu i zapisu (O_RDWR). Lub zgloszono
PROT_WRITE, lecz plik jest otwarty tylko do dopisywania.
EINVAL Niewlaciwe start, length lub offset. (Np., mog by zbyt due lub
niewyrownane do granicy strony (PAGESIZE).)
ETXTBUSY
Ustawiono MAP_DENYWRITE, lecz obiekt wskazywany przez fd jest
otwarty do zapisu.
EAGAIN Plik zostal zablokowany lub zablokowano zbyt wiele pamici.
ENOMEM Brak dostpnej pamici lub zostalaby przekroczona maksymalna
liczba mapowa dla procesu. ENODEV System plikow, na ktorym
znajduje sie podany plik nie wspiera mapowania w pamici.
Uycie zamapowanego obszaru moe spowodowa wystpienie nastpujcych
sygnalow:
SIGSEGV
Proba zapisu do obszaru podanego dla mmap jako tylko do odczytu.
SIGBUS Proba dostpu do fragmentu bufora, ktory nie odpowiada plikowi
(na przyklad, za kocem pliku, wlczajc w to przypadek obcicia
pliku przez inny process).
ZGODNE Z
SVr4, POSIX.1b (poprzednio POSIX.4), 4.4BSD, SUSv2. SVr4 dokumentuje
dodatkowe bldy ENXIO i ENODEV. SUSv2 dokumentuje dodatkowe bldy EMFILE
i EOVERFLOW.
MAP_32BIT jest rozszerzeniem linuksowym.
ZOBACZ TAKE
getpagesize(2), mmap2(2), mremap(2), msync(2), shm_open(2), B.O.
Gallmeister, POSIX.4, O'Reilly, str. 128-129 i 389-391.
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.