MMAP(2) | Podręcznik programisty Linuksa | MMAP(2) |
mmap, munmap - mapowanie lub usunięcie mapowania plików lub urządzeń w pamięci
#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
Uwaga! To tłumaczenie może być nieaktualne!
Funkcja mmap zleca zamapowanie do pamięci, najchętniej pod adres start, length bajtów pliku (lub innego obiektu) zadanego przez deskryptor fd, przesuniętych względem początku 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 sposów ochrony pamięci (i nie może być sprzeczny z trybem otwarcia pliku). Może on być równy PROT_NONE lub może być logicznym OR jednego lub więcej spośród innych znaczników PROT_*.
Patametr flags określa rodzaj mapowanego obiektu, opcje mapowania i czy modyfikacje na zmapowanej kopii strony są prywatne dla procesu, czy też powinny być współdzielone z innymi odniesieniami. Ma on bity
Trzeba podać dokładnie jedno spomiędzy MAP_SHARED i MAP_PRIVATE.
Powyższe trzy znaczniki są opisane w POSIX.1b (poprzednio POSIX.4) oraz SUSv2. Linux obsługje dodatkowo następujące znaczniki niestandardowe:
Niektóre systemy dokumentują dodatkowe znaczniki MAP_AUTOGROW, MAP_AUTORESRV, MAP_COPY i MAP_LOCAL.
fd powinno być prawidłowowym deskryptorem pliku; jeżeli ustawiono MAP_ANONYMOUS, to argument ten jest ignorowany.
offset powinno być wielokrotnością rozmiaru strony zwracanego przez getpagesize(2).
Pamięć zamapowana za pomocą mmap jest zachowywana poprzez fork(2) z tymi samymi atrybutami.
Plik jest mapowany w wielokrotnościaćh rozmiaru strony. Dla plików, które nie są wielokrotnościami rozmiaru strony, pozostała pamięć jest zerowana podczas mapowania, a zapisy do tego obszaru nie są zapisywane w pliku. Efektem zmiany rozmiaru zamapowanego pliku na zamapowane strony, które odpowiadają dodanym lub usuniętym obszarom pliku, jest nieokreślony.
Funkcja systemowa munmap usuwa mapowanie z podanego zakresu adresów i powoduje, że dalsze odwołania do adresów z tego zakresu będą generować nieprawidłowe odwołania do pamięci. Mapowanie obszaru jest również automatycznie usuwane, gdy proces się zakończy. Z drugiej strony, zamknięcie deskryptora pliku nie usuwa mapowania obszaru.
Adres start musi być wielokrotnością rozmiaru strony. Usuwane jest mapowanie wszystkich stron zawierających fragmenty ze wskazanego zakresu, wszystkie późniejsze odwołania do tych stron wygenerują SIGSEGV. Nie jest błędem, gdy brak w podanym zakresie zamapowanych stron.
Dla mapowań opartych na plikach pole st_atime zamapowanego pliku może zostać zaktualizowane w dowolnym momencie pomiędzy mmap() i usunięciem odpowiedniego mapowania; pierwsze odwołanie do zamapowanej strony spowoduje zaktualizowanie tego pola, jeśli nie stało się to wcześniej.
Pola st_ctime i st_mtime pliku zamapowanego z PROT_WRITE i MAP_SHARED zostanie zaktualizowane po zapisie do mapowanego obszaru, a przed późniejszym wywołaniem msync() ze znacznikiem MS_SYNC lub MS_ASYNC, jeśli taki wywołanie wystąpi.
Po pomyślnym zakończeniu B mmap zwraca wskaźnik do mapowanego obszaru. Po błędzie zwracane jest MAP_FAILED (-1) i odpowiednio ustawiane jest errno. Po pomyślnym zakończeniu munmap zwraca 0, a po błędzie -1 i ustawia errno (prawdopodobnie na EINVAL).
To, czy PROT_READ zawiera PROT_EXEC, czy nie, zależy od architektury. W przenośnych programach należy zawsze ustawiać PROT_EXEC, gdy planowane jest uruchamianie przez nie kodu w nowym mapowaniu.
Użycie zamapowanego obszaru może spowodować wystąpienie następujących sygnałów:
SVr4, POSIX.1b (poprzednio POSIX.4), 4.4BSD, SUSv2. SVr4 dokumentuje dodatkowe błędy ENXIO i ENODEV. SUSv2 dokumentuje dodatkowe błędy EMFILE i EOVERFLOW.
MAP_32BIT jest rozszerzeniem linuksowym.
getpagesize(2), mmap2(2), mremap(2), msync(2), shm_open(2), B.O. Gallmeister, POSIX.4, O'Reilly, str. 128-129 i 389-391.
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne. W razie zauważenia różnic między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:
Prosimy o pomoc w aktualizacji stron man - więcej informacji można znaleźć pod adresem http://sourceforge.net/projects/manpages-pl/.
2000-03-25 | Linux 2.3.51 |