Manipularea fisierelor

Sistemul de operare Linux ataşează intern fiecărui fişier deschis un descriptor sau identificator de fişier (în principiu, un număr întreg pozitiv). La deschiderea unui fişier sau la crearea unui fişier nou, sistemul returnează un descriptor de fişier procesului care a executat apelul. Descriptorul de fişer este folosit în cadrul operaţiilor de scriere şi citire. Fiecare aplicaţie îşi are proprii descriptori de fişier. Prin convenţie, primii trei descriptori de fişier ai fiecărei aplicaţii sunt deschişi automat la începutul unui proces. Descriptorul de fişier 0 identifică intrarea standard, 1 identifică ieşirea standard, iar 2 ieşirea standard de erori.

Deshiderea fisierelor

Funcţia sistem prin intermediul căreia se deschide un fişier pentru scrierea sau citire este open. Semnătura funcţiei este următoarea:

     #include <fcntl.h>
 
     int
     open(const char *path, int flags, mode_t mode);
 

Apelul open() deschide un fişier şi returnează descriptorul prin care respectivul fişier poate fi manipulat. Acest apel poate fi folosit şi pentru a crea un fişier; în acest caz, trebuie furnizat un argument suplimentar care să precizeze drepturile de acces. Primul argument este numele fişierului. Al doilea argument este 0_RDONLY, O_WRONLY sau O_RDWR; aceste valori pot fi combinate, prin intermediul operatorului | (sau pe biţi), cu O_TRUNC, O_APPEND, O_CREAT şi O_EXCL.

Creare fisier nou

Funcţia sistem prin intermediul căreia se creează un fişier nou este funcţia creat. Semnătura funcţiei este următoarea:

     #include <fcntl.h>
 
     int
     creat(const char *path, mode_t mode);

Argumentul path specifică numele fişierului, iar mod drepturile de acces. Dacă fişierul creat nu există, este alocat un nou i-node şi o legătură spre el este plasată în directorul unde acesta a fost creat. Proprietarul (UID-ul efectiv şi GUID-ul efectiv) procesului care execută acest apel trebuie să aibă permisiunea de scriere în director.

Citirea din fisier

Funcţia sistem prin intermediul căreia se citeşte dintr-un fişier este funcţia read. Semnătura funcţiei este următoarea:

    #include <sys/types.h>
    #include <sys/uio.h>
    #include <unistd.h>
 
    ssize_t
    read(int d, void *buf, size_t nbytes);
 
    ssize_t
    readv(int d, const struct iovec *iov, int iovcnt);
 
    ssize_t
    pread(int d, void *buf, size_t nbytes, off_t offset);

Funcţia returnează numărul de octeţi citiţi efectiv, 0 pentru sfârşit de fişier (EOF) şi -1 în caz de eroare. Se citesc noct octeţi din fişierul deschis referit de descriptorul fd şi se depun în tamponul referit de buf. Pointerul (poziţia curentă) în fişier este incrementat automat după o operaţie de citire cu numărul de octeţi citiţi. Procesul care execută o operaţie de citire aşteaptă până când sistemul depune datele de pe disc în buffer.

Scrierea intr-un fisier

Funcţia sistem prin intermediul căreia se scrie într-un fişier este funcţia write. Semnătura funcţiei este următoarea:

    #include <sys/types.h>
     #include <sys/uio.h>
     #include <unistd.h>
 
     ssize_t
     write(int d, const void *buf, size_t nbytes);
 
     ssize_t
     writev(int d, const struct iovec *iov, int iovcnt);
 
     ssize_t
     pwrite(int d, const void *buf, size_t nbytes, off_t offset);

Funcţia returnează numărul de octeţi scrişi si -1 in caz de eroare. Apelul scrie noct octeţi din tamponul buf în fişierul a cărui descriptor este fd.

Inchiderea unui fisier

Funcţia sistem prin intermediul căreia se închide un fişier este funcţia close. Semnătura funcţiei este următoarea:

     #include <unistd.h>
 
     int
     close(int d);

Apelul close() închide un descriptor. Este important să închideţi descriptorii (atunci când nu mai aveţi nevoie de fişierul corespunzător) deoarece numărul descriptorilor pe care un proces îi poate utiliza este limitat (de obicei, 1024).

Positionarea absoluta intr-un fisier

Funcţia sistem prin intermediul căreia se poate deplasa indicatorul de poziţionare în fişier este funcţia lseek. Semnătura funcţiei este următoarea:

     #include <unistd.h>
 
     off_t
     lseek(int fildes, off_t offset, int whence);
 

Pentru poziţionarea absolută sau relativă a indicatorului poziţiei curente într-un fişier se foloseşte apelul lseek. Relativ la poziţia curentă din fişier se efectuează operaţiile de citire şi scriere. Funcţia returnează deplasamentul faţă de începutul fişierului a noi poziţii curente din fişier sau -1 în caz de eroare.