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.