Rubrikfil:
#omfattaSyntax:
void * mmap (void * address, size_t length, int protect, int flags, int filedes,off_t offset)
Argument:
Funktionen tar 6 argument:
1. adress:
Detta argument ger en önskad startadress för mappningen. Om en annan mappning inte finns där kommer kärnan att välja en sidgräns i närheten och skapa mappningen. annars väljer kärnan en ny adress. Om det här argumentet är NULL kan kärnan placera kartläggningen var som helst.
2. längd:
Detta är antalet byte som ska mappas.
3. skydda:
Detta argument används för att kontrollera vilken typ av åtkomst som är tillåten. Detta argument kan vara logiskt 'ELLER' för följande flaggor PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE. Åtkomsttyperna läsa, skriva och köra är behörigheterna för innehållet.
4. flaggor:
Detta argument används för att kontrollera karaktären på kartan. Följande är några vanliga värden för flaggorna:
- MAP_SHARED: Denna flagga används för att dela kartläggningen med alla andra processer som mappas till detta objekt. Ändringar som gjorts i kartområdet kommer att skrivas tillbaka till filen.
- MAP_PRIVATE: När den här flaggan används kommer kartläggningen inte att ses av andra processer och ändringarna kommer inte att skrivas till filen.
- MAP_ANONYMOUS / MAP_ANON: Denna flagga används för att skapa en anonym kartläggning. Anonym kartläggning innebär att kartläggningen inte är ansluten till några filer. Denna kartläggning används som grundläggande primitiv för att förlänga högen.
- MAP_FIXED: När denna flagga används måste systemet tvingas använda den exakta mappningsadress som anges i adress Om detta inte är möjligt misslyckas mappningen.
5. ansöker:
Detta är filbeskrivaren som måste mappas.
6. offset:
Detta kompenseras från var filmappningen startade. Enkelt uttryckt ansluter kartläggningen till (offset) till (offset + längd-1) byte för filen öppnas den lämnar in beskrivare.
Returvärden:
När det gäller framgång, mmap () returnerar 0; för fel returnerar funktionen MAP_FAILED.
Bildmässigt kan vi representera kartfunktionen enligt följande:
För att avbilda den mappade regionen kartlägga () funktionen används:
Syntax:
int munmap(tomhet *adress, storlek_t längd);
Returvärden:
När det gäller framgång, kartlägga () returnerar 0; för fel returnerar funktionen -1.
Exempel:
Nu ser vi ett exempelprogram för vart och ett av följande med mmap () systemanrop:
- Minnesallokering (exempel 1.c)
- Läser fil (exempel 2.c)
- Skrivfil (exempel 3.c)
- Interprocesskommunikation (exempel 4.c)
Exempel 1.c
#omfatta#omfatta
int main ()
int N = 5; // Antal element för matrisen
int * ptr = mmap (NULL, N * sizeof (int),
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS,
0, 0);
om (ptr == MAP_FAILED)
printf ("Mappning misslyckades \ n");
retur 1;
// Fyll elementen i matrisen
för (int i = 0; i ");
för (int i = 0; i
printf ("\ n");
int err = munmap (ptr, 10 * sizeof (int));
if (err != 0)
printf ("Unmapping Misslyckades \ n");
retur 1;
returnera 0;
I exempel 1.c vi fördelar minne med hjälp av mmap. Här använde vi PROT_READ | PROT_WRITE-skydd för läsning och skrivning till den mappade regionen. Vi använde MAP_PRIVATE | MAP_ANONYMOUS flagga. MAP_PRIVATE används eftersom kartläggningsregionen inte delas med andra processer och MAP_ANONYMOUS används för att här har vi inte kartlagt någon fil. Av samma anledning har filbeskrivare och den offset värdet är satt till 0.
Exempel 2.c
#omfatta#omfatta
#omfatta
#omfatta
#omfatta
#omfatta
int main (int argc, char * argv [])
om (argc < 2)
printf ("Filvägen nämns inte \ n");
exit (0);
const char * filepath = argv [1];
int fd = öppen (filpath, O_RDONLY);
if (fd < 0)
printf ("\ n \"% s \ ""kunde inte öppna \ n"",
sökväg)