Sunteți pe pagina 1din 22

APELURI SISTEM PENTRU OPERATIILE CU FISIERE

Sisteme de operare 2

Cuprins
Apeluri sistem Descriptorii de fisiere Apelul sistem open Apelul sistem creat Apelul sistem lseek Exemplu

Apeluri sistem
Functii prin care un sistem de operare ofera servicii programatorilor Sunt apelabile ca un apel obisnuit de functie Pentru functiile obisnuite

codul functiei este prezent in biblioteca este adaugat programului in care se apeleaza functia la linkeditare Codul de biblioteca pregateste intrarea in sistemul de operare Preluarea rezultatelor si transmiterea lor spre programul apelant Executia are loc intr-o secventa ce face parte din sistemul de operare Intrarea in sistem = schimbarea regimului de munca din modul neprivilegiat in modul privilegiat

Pentru apelurile sistem


Descriptori de fisier
Identificator prin care nucleul Unix identifica toate fisierele deschise de un proces Intreg nenegativ

atribuit de nucleu la deschiderea fisierului ce ramane valabil pana la inchiderea acestuia Operatia prin care intre un proces si un fisier se creeaza un canal de comunicare Fisierul standard de intrare - descriptorul 0 Fisierul standard de iesire - descriptorul 1 Fisierul standard de eroare - descriptorul 2

Deschiderea de fisier

Interpretoarele Unix deschid 3 fisiere standard:


Descriptorii de fisiere
Sunt limitati la nivelul unui proces 32 sau 64 Pot fi referiti prin constante simbolice
STDIN_FILENO STDOUT_FILENO STDERR_FILENO Definite

in <unistd.h> Cresterea portabilitatii programelor pe diverse versiuni sau platforme

Apelul sistem open


Este folosit pentru deschiderea unui fisier #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open (const char *pathname, int oflag, /*, mode_t mode*/ );

Apelul sistem open


Returneaza o valoare ne-negativa daca apelul se executa fara eroare Returneaza -1 daca la executie apare vreo eroare Primul argument este numele de cale al fisierului Al doilea argument indica optiunile de deschidere Al treilea argument apare numai daca la deschidere are loc si creare fisierului

Optiunile de deschidere ale apelului sistem open (1)


O_RDONLY deschide fisier pentru citire O_WRONLY deschide fisier pentru scriere O_RDWR deschide fisier pentru citire si scriere (actualizare) O_APPEND adauga la sfarsitul fisierului la fiecare operatie de scriere

Optiunile de deschidere ale apelului sistem open (2)


O_CREAT creaza fisierul daca el nu exista deja, caz in care al treilea argument reprezinta drepturile de acces O_EXCL genereaza o eroare daca s-a specificat si O_CREATE in caz ca fisierul exista; testul de existenta si crearea se executa ca operatie atomica O_TRUNC daca fisierul exista si poate fi deschis pentru scriere sau citire-scriere atunci lungimea sa se trunchiaza la zero

Optiunile de deschidere ale apelului sistem open (3)


O_NOCTTY daca numele de cale se refera la un terminal, atunci acel terminal nu va fi alocat ca si terminal de control pentru procesul curent O_NONBLOCK daca numele de cale se refera la vre-un periferic orientat pe caracter sau pe bloc, fisierul se deschide cu optiunea ca operatiile cu el nu conduc la blocarea procesului care le solicita O_SYNC efectuarea oricarei operatii de scriere se asteapta pana la terminarea operatiei la nivel fizic

Apelul sistem creat


Este folosit pentru crearea unui nou fisier #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int creat (const char *pathname, mode_t mode); echivalent cu apelul open (pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);

Apelul sistem creat


Deschiderea implicita -> dezavantaje:
Crearea


unui fisier temporar implica

Scriere  Inchidere  Deschidere in citire-scriere


Alternativa


open(pathname,O_RDWR | C_CREAT | O_TRUNC, mode);

Apelul sistem close


Este folosit pentru deconectarea (inchiderea) unui fisier dechis de la un proces Prototip #include <unistd.h> int close(int filedes); Returneaza
zero

in caz de succes -1in caz de eroare

Apelul sistem lseek


indicator de prelucrare sau deplasament curent
asignat

la fiecare fisier deschis de sistemul de operare intreg ne-negativ relativ la inceputul fisierului initializat la zero la deschiderea fisierului (daca nu apare O_APPEND)

sintaxa: #include <sys/types.h> #include <unistd.h> off_t lseek(int filedes, off_t offset, int whence);

Apelul sistem seek


Returneaza noua valoare a deplasamentului -1 in caz de eroare Valorile posibile pentru al treilea parametru
SEEK_SET

-> valoarea deplasamentului va fi offset fata de inceputul fisierului SEEK_CUR -> valoarea deplasamentului va fi vechea sa valoare plus valoarea offset SEEK_END -> valoarea deplasamentului va fi lungimea curenta a fisierului la care se adauga valoarea offset

Determinarea deplasamentului curent

off_t poz; poz = lseek(fd, 0, SEEK_CUR);

Exemplu
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> char buf1[]=abcdefghij; char buf2[]=ABCDEFGHIJ;

Exemplu
int main(void) { int fd; if((fd=creat(fis.gol,0644))<0) { printf(eroare creare\n); exit(1); }

Exemplu
if(write(fd,buf1,10)!=10) { printf(eroare scriere buf1 \n); exit(2); } // deplasamentul a devenit 10 if (lseek(fd, 40, SEEK_SET)==-1) { printf(eroare lseek\n); exit(3); }

Exemplu
//acum deplasamentul este 40 if(write(fd,buf2,10)!=10) { printf(eroare scriere buf2\n); exit(4); } // deplasamentul este acum 50 exit(0); }

Compilarea si rularea exemplului


$ gcc fisgol.c o fisgol $ ./fisgol $ od c fis.gol

Bibliografie
Ioan Jurca Programarea de sistem in UNIX, Editura de Vest, Timisoara, 2004

S-ar putea să vă placă și