next up previous contents
Next: Egyébfájlokkal kapcsolatos Up: A fájlrendszer rendszerhívásai Previous: Alapvetofájlokkal kapcsolatos

A fájlrendszer és a memóriakezelo kapcsolata

A UNIX operációs rendszer újabb változatai lehetoséget adnak a fájlok memórián keresztül történo elérésére a fájlnak a memóriába ágyazásával (ezzel lehetoség nyílik a fájl tartalmának memóriamuveletek segítségével történo módosítására, amely gyakran hatékonyabb a hagyományos read() illetve write() rendszerhívásoknál.) Erre az mmap() UNIX rendszerhívást használhatjuk, melynek prototípusa a következo:

  caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, 
               int fd, off_t offset);

Az mmap() rendszerhívás elso paramétere caddr_t típusú (az ilyen típusú változók egy tetszoleges memóriacímet kaphatnak értékül, általában char * típussal implementálják). Az elso argumentumban azt a memóriacímet kell megadnunk, ahova be akarjuk ágyazni a kérdéses fájlt (vagy annak egy részét). A programok hordozhatósága érdekében itt 0-t adjunk meg, ugyanis ekkor az operációs rendszer maga választ egy szabad memóriaterületet, ahova a fájlt beágyazza. Sikeres végrehajtás esetén az mmap() rendszerhívás az fd argumentumban kijelölt fájldeszkriptorú fájl offset argumentumában adott pozíciótól kezdodo len argumentumban bájtokban megadott hosszú részét beágyazza, és a rendszerhívás visszatérési értéke a beágyazott fájl-rész memóriabeli kezdocíme (a beágyazás kezdocíme).

A prot paramétert a PROT_READ, PROT_WRITE, PROT_EXEC szimbólikus konstansok bitenkénti VAGY muvelettel képzett kapcsolatával állíthatjuk elo aszerint, hogy a beágyazott fájl-részen milyen muveleteket akarunk megengedni (olvasni,írni vagy végrehajtani akarjuk a részeit). Ha egy fájlra nincs írási engedélyünk a hozzá tárolt rwx-bitek alapján, akkor a memóriába ágyazással sem módosíthatjuk azt.

A flags argumentum értéke vagy MAP_PRIVATE vagy pedig MAP_SHARED lehet (általában). Ha itt MAP_PRIVATE-et adunk meg, akkor a fájlon végzett módosítások idolegesek, azaz az eredeti fájlon nem jelennek meg, a fájl többi felhasználója nem látja azokat.

#include <stdio.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>

main()
{
  int fd;
  char *ra;

  fd=creat("cmmap1t",0666);
  write(fd,"alma",4);
  close(fd);

  fd=open("cmmap1t",O_RDWR);
  ra=mmap(0,4,PROT_WRITE|PROT_READ,MAP_SHARED,fd,0);
  if (ra == (caddr_t)(-1)) perror("mmap sikertelen");
  *(ra+2)='f';
  munmap(ra,4);
  close(fd);
}



Csizmazia Balazs
Tue Apr 2 00:06:27 MET DST 1996