next up previous contents
Next: A fájlrendszer és Up: A fájlrendszer rendszerhívásai Previous: A fájlrendszer rendszerhívásai

Alapveto, fájlokkal kapcsolatos rendszerhívások

Az access() rendszerhívással lehet lekérdezni az operációs rendszertol azt, hogy egy adott fájlon egy adott muveletet elvégezhetünk-e. Lekérdezhetjük, hogy egy adott nevu fájl létezik-e, olvashatjuk-e, írhatjuk-e illetve végrehajthatjuk-e azt. Az ellenorzés nem az effektiv user- ill. group-id alapján történik.

A creat() és az open() rendszerhívás foglalkozik a fájlok megnyitásával. A creat() létrehoz egy, az elso paraméterében megadott nevu fájlt, ha eddig az adott nevu fájl nem létezett; ha pedig az elso paraméterében megadott fájl már létezik, akkor annak a hosszát 0 bytera állítja. A creat() rendszerhívás visszatérési értéke egy egész típusú érték, egy ún. fájldeszkriptor. Ezzel lehet késobb a fájlmuveleteknél erre a fájlra hivatkozni. A creat() ezenkívül beállítja a második paraméterében megadott érték szerint az új fájl védelmi bitjeit.

Az open() rendszerhívás egy már meglevo fájlt nyit meg írásra vagy olvasásra. A megnyitandó fájl neve az open() elso paramétere, a második paraméter értéke általában 0, ha a fájlt olvasásra nyitjuk meg; 1, ha a fájlt írni akarjuk (ezeknek megfelelo konstansok: az O_RDONLY, O_WRONLY illetve O_RDWR, amelyek az <fcntl.h> nevu header-fájlban vannak deklarálva). Ennek a visszatérési értéke szintén egy fájldeszkriptor.

A close() rendszerhívás a paraméterében megadott fájldeszkriptorhoz tartozó fájlt lezárja. Itt érdemes megjegyezni azt, hogy minden egyes folyamat fájldeszkriptorjai 0-tól kezdodoen vannak sorszámozva, és ha egy új fájlt megnyitunk, akkor mindig a legkisebb "értéku" fájldeszkriptor lesz a fájlhoz rendelve. (Ez azt jelenti, hogy ha pl. a 0-ás fájldeszkriptort lezárjuk, akkor a következo open() rendszerhívás a megnyitott fájlt a 0-ás fájldeszkriptorhoz fogja kötni. Minden program elindulásakor három "szabványosan" megnyitott fájlon dolgozhat: a 0-ás deszkriptorú szabványos bemeneten, az 1-es deszkriptorú szabványos kimeneten és a 2-es deszkriptorú szabványos hibacsatornán. Alaphelyzetben ezek a terminálhoz (billentyuzethez ill. képernyohöz) vannak rendelve, de a shell-ben ezek átirányíthatóak tetszoleges fájlba.)

A következo lényeges rendszerhívások: a read() és a write() rendszerhívások. Ezekkel lehet egy már megnyitott fájlon valamilyen muveletet végezni: a fájlból adatokat olvasni, és a fájlba adatokat írni. Mindkét rendszerhívás elso paramétere annak a fájlnak a fájldeszkriptorja, amelyen az adott fájlmuveletet el akarjuk végezni. A második paraméter tartalmazza annak az adatterületnek a címét, ahonnan az adatokat a fájlba akarjuk írni (ill. read rendszerhívásnál: ahová a fájlból olvasni akarunk). Az utolsó paraméter a fenti adatterület hosszát tartalmazza, vagyis a maximálisan beolvasandó (ill. kiírandó) byteok számát. Ezeknek a rendszerhívásoknak egész típusú a visszatérési értéke, és a visszatérési érték megadja a rendszerhívás során ténylegesen kiírt ill. beolvasott byteok számát. (Például ha a read() rendszerhívás fájlvégéhez ér, és nincs a fájlban már annyi karakter, amennyit a rendszerhívás harmadik paraméterében megadtunk, akkor csak annyi karaktert fog beolvasni, amennyi a fájlban van, és ennek megfeleloen a visszatérési értéke kisebb lesz a harmadik paraméter értékénél).

A fenti rendszerhívások használatára láthatunk példát a következo programrészletben:

   fggv()
   {
     int fd1,fd2;
     char buf[512];
     int rc;

     fd1=open("/usr/csb/filenev",0); /* 0 = olvasasra nyitom meg */
     fd2=creat("/usr/csb/ujfile",0644); /*  rw-r--r-- biteket \'all\'\i t */
     /*
       Az fd1 filebol atmasoljuk az fd2 fileba maximum az elso 512
       darab karaktert.
     */
     rc=read(fd1,buf,512);
     if (rc>0) write(fd2,buf,rc);
     /*
          ...
     */
     close(fd2);
     close(fd1);
   }

A lseek() rendszerhívással lehet egy fájlban "pozícionálni" (ahol a pozícionálás értelmezett) úgy, hogy pl. a következo read() onnan kezdi el olvasni a fájlt, ahová pozícionáltunk. A lseek rendszerhívásnak három paramétere van: az elso és a harmadik egész, a második pedig (C-ben) long típusú (ezt a programban a konstansok megadásakor ne feledjük el!). Az elso paraméter annak a fájlnak a deszkriptorát tartalmazza, amelyben pozícionálni akarunk. A második paraméter tartalmaz egy "pozíciót" (pl. lehet, hogy azt tartalmazza, hogy a fájl hányadik karakterére akarunk pozícionálni). Ha a harmadik paraméter SEEK_SET, akkor a fájlban arra a karakterre kell pozícinálni, amelynek a pozícióját a második paraméter tartalmazza. Ha a harmadik paraméter SEEK_CUR, akkor a fájlban beállítandó pozíció egyenlo az aktuális pozíciónak és a második paraméternek az összegével. Ha pedig a harmadik paraméter értéke SEEK_END, akkor az új fájlpozíció egyenlo lesz a fájl hosszának és a második paraméternek az összegével. A rendszerhívás visszatérési értéke long típusú, és az új aktuális fájlpozíciót tartalmazza. Megjegyezzük, hogy a SEEK_SET, SEEK_CUR, SEEK_END makrók (konstansok) az <unistd.h> header-fájlban vannak definiálva.



next up previous contents
Next: A fájlrendszer és Up: A fájlrendszer rendszerhívásai Previous: A fájlrendszer rendszerhívásai



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