Mihai Sprinceana
Un forum de programare cu de toate. Va astept sa va inscrieti si sa deveniti moderatori. Oricine este binevenit aici sa se inscrie si sa aiba acces la informatie free! Fiecare este liber sa adauge proiecte programe free etc. Ajutati acest forum sa devina o comunitate puternica unde fiecare invata de la fiecare! Tot ce trebuie sa faceti este sa va inregistrati si fiecare contributie se poate dovedi utila in timp! Forumul este free informatia free dk aveti timp liber ajutati si pe ceilalti si invatati si voi in acelasi timp! Haideti sa facem ceva pt.a ne ajuta intre noi! Cititi regulament postare forum inainte de a posta!
Lista Forumurilor Pe Tematici
Mihai Sprinceana | Inregistrare | Login

POZE MIHAI SPRINCEANA

Nu sunteti logat.
Nou pe simpatie:
lovely_pink la Simpatie.ro
Femeie
25 ani
Bucuresti
cauta Barbat
25 - 48 ani
Mihai Sprinceana / SO Linux&Unix / Functia fcntl (apel sistem) Moderat de Cristy89, Houssey, cr3us, fireratbat, profu.info, sade5000
Autor
Mesaj Pagini: 1
cr3us
Moderator

Inregistrat: acum 16 ani
Postari: 160
fcntl - permite lucrul cu descriptori de fisier

Trebuie incluse urmatoarele fisiere header(biblioteca):

#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);

fcntl- permite multiple operatii asupra unui descriptor de fisier fd.
 
Flagul close-on-exec

F_DUPFD - gaseste cel mai mic numar valabil de descriptor de fisier >= decat nr. de argumente al unui fisier
   
Descriptorii de fisier vechi si noi pot fi folositi si interschimbati. Ei impart aceleasi flag-uri aceleasi pozitii pt.pointerii de fisier etc.

Cei 2 descriptori insa nu vor imparti acelasi flag close-on-exec deoarece close-on-exec flag este dezactivat.
In caz de succes noul descriptor este intors.


F_GETFD -citeste flag-ul close-on-exec. Daca bitul FD_CLOEXEC=0 fisierul va ramane deschis in timpul executiei; in caz contrar el fiind inchis


F_SETFD -seteaza valoarea flag-ului close-on-exec specificata de bitul FD_CLOEXEC al argumentului.
   

Un descriptor al unui fisier notat cu fd are flag-uri asociate utilizate de open si modificate de fcntl. Flag-urile sunt impartite intre copii ( facute cu dup-duplicate sau fork) in acelasi descriptor de fisier

In continuare vor fi prezentate flag-urile si semnificatia lor descrise de open:



F_GETFL - citeste flag-urile fisierului descriptor

F_SETFL -seteaza starea flag-urilor pt.fisier al flag-urilor descriptor la valoarea specificat de arg(argument)
   
Blocare recomandata:

F_GETLK, F_SETLK and F_SETLKW -sunt folosite pt. a primi, elibera si testa pt. exista unor blocari inregistrare cunoscute ca segmentari de fisier(file segment) sau blocari ale regiunilor fisierelor. Al treilea argument lock este un pointer catre o structura care are urmatoarele campuri (intr-o ordine nespecificata):

struct flblock {
    ...
    short l_type;    /* Type of lock: F_RDLCK,
                        F_WRLCK, F_UNLCK */
    short l_whence;  /* How to interpret l_start:
                        SEEK_SET, SEEK_CUR, SEEK_END */
    off_t l_start;   /* Starting offset for lock */
    off_t l_len;     /* Number of bytes to lock */
    pid_t l_pid;     /* PID of process blocking our lock
                        (F_GETLK only) */
    ...
};


Dupa cum se observa campurile l_whence, l_start, and l_len ale structurii numite flblock specifica intervalul de biti pe care dorim sa-l blocam.

l_start -reprezinta offset-ul de start pt.blocare si este interpretat ca startul unui fisier (daca l_whence este SEEK_SET); sau ca offset-ul curent t (daca l_whence este SEEK_CUR); sau ca sfaristul unui fisier   (daca l_whence este SEEK_END).

In ultimele 2 cazuri l_start poate fi un nr.negativ care este furnizat si care nu se afla dupa inceputul unui fisier.


l_len -este un intreg negativ si specificat de nr.de bytes blocati ce trebuie blocati. Daca bytes-i se afla la sfarsitul unui fisier pot fi blocati in caz contrar blocare imposibila!


Specificand valoarea 0 pt. l_len are un inteles special: blocheaza toti bytes-i incepand cu locatia specificat de  l_whence si l_start through pana la sfarsitul fisierului indiferent ca marimea fisierului creste.

Campul l_type poate fi folosit pt a plasa o operatie de citire(F_RDLCK) sau scriere(F_WDLCK) pt.a bloca un fisier.


Orice numar de procese pot detine o blocare prin citire(shared lock-blocare partajata) pt. o regiune a unui fisier dar doar un singur proces poate detine o blocare prin scriere(exclusive lock-blocare exclusiva)

O blocare exclusiva exclude celelalte blocari atat cele partajate cat si cele exclusive. UN singur proces poate detine un singur tip de blocare a regiunii unui fisier. Daca o noua blocare este aplicata unei regiuni deja blocate atunci blocarea existenta va fi convertita catre un nou tip de blocare.


F_SETLK -achizitioneaza o blocare (at.cand l_type este F_RDLCK sau F_WRLCK) sau elibereaza o blocare(at.cand l_type este F_UNLCK) ale bytes-ilor specificati de  l_whence, l_start si l_len fields ale blocarii.

Daca o blocare conflictuala detinuta de un alt proces acest apel intoarce -1 si seteaza mesaj de eroare EACCES sau EAGAIN.

F_SETLKW - ca si  F_SETLK aceeasi idee, doar daca un o blocare conflictuala este detinuta de fisier atunci asteapta ca acea blocare sa fie eliberata. Daca un semnal este prins in momentul asteptarii atunci apelul este intrerupt(dupa ce a intors handler-ul semnalului-adica modul de tratare al acestuia)

F_GETLK - in momentul acestui apel , este descrisa o blocare pe care dorim sa o plasam intr-un fisier. Dca blocare poate fi plasata fcntl() nu o plaseaza propriu-zis dar intoarce F_UNLCK in campul l_type al blocarii si lasa alte campuri ale structurii neschimbate.

Daca una sau mai multe blocari incompatibile impiedica ca aceasta blocare sa fie plasata, atunci fcntl() va retunra detalii despre aceste blocari in campurile blocarii( l_type, l_whence, l_start, si l_len ) si seteaza l_pid sa fie PID procesului care detine acea blocare. Pt. a plasa o blocare pt.citire fisierul descriptor fd trebuie sa fie deschis pt.citire(similar in cazul blocarii pt.scriere).

Pt.a plasa ambele tipuri de blocari fisierul descriptor fd trebuie sa fie deschis pt.citire-scriere.


Blocare obligatorie- reprezinta o blocare fortata a proceselor. Este aplicata in general oricarui tip de procese.


Pt.a realiza blocarea obligatorie a unui proces vom folosi urmatoare comanda in shell:
mount -o mand

mand- vine de la mandatory -obligatoriu

Blocarea recomandata - nu reprezinta o blocare fortata si este utila in cazul proceselor cooperante.


Gestionarea semnalelor:



F_GETOWN, F_SETOWN, F_GETSIG and F_SETSIG sunt folosite pt. a gestiona semnalele disponibile pt. operatiile I/O:

F_GETOWN -ia id-ul procesului sau al grupului de procese si primeste in mod obisnuit semnalele SIGIO si SIGURG pentru evenimente pt. descriptorul de fisier fd. Grupurile de procese sunt intoarse ca valori negative.


F_SETOWN -seteaza id-ul procesului sau al grupului de procese si primeste in mod obisnuit semnalele SIGIO si SIGURG pentru evenimente pt. descriptorul de fisier fd. Grupurile de procese sunt intoarse ca valori negative.(F_SETSIG poate fi folosit pt. a specifica un semnal diferit folosit in locul semnalului SIGIO)

Daca setam flag-ul de stare O_ASYNC pe un fisier descriptor(ori folosind acest flag cu apelul de sistem open() sau folosind comanda F_SETFL inclusa in fisierul header fcntl.h), un semnal SIGIO este trimis oricand este posibila o intrare sau iesire a fisierului descriptor fd.

Procesul sau grupul de procese pt. a primi un semnal pot fi selectate folosind comanda F_SETOWN comanda inclusa in fisierul header(biblioteca) fcntl.h. Daca descriptorul de fisier este un socket acesta va selecta continutul din recipient al semnalelor SIGURG care vor fi trimise cand datele out-of-band ajung pe acel socket(SIGURG este trimis in orice situatie). Daca descriptorul de fisier corespunde unui terminal al unui dispozitiv atunci semnalele SIGIO sunt trimise proceselor din fata terminalului.


F_GETSIG - este o functie ce ia semnalul trimis cand intrarile sau iesirile devin posibile. O valoare de 0 inseamna faptul ca semnalul SIGIO este trimis. Orice alta valoare(incluzand SIGIO) este semnalul trimis si in cazul in care informatia este valabila handler-ului de semnal(reprezinta in esenta un mod de tratare al semnalului respectiv) este instalat lucru semnalat de SA_SIGINFO.

F_SETSIG -reprezinta o functie de setare a semnalului trimis cand intrarile sau iesirile devin posibile. O valoare de 0 inseamna faptul ca semnalul SIGIO este trimis. Orice alta valoare(incluzand SIGIO) este semnalul trimis si in cazul in care informatia este valabila handler-ului de semnal(reprezinta in esenta un mod de tratare al semnalului respectiv) este instalat lucru semnalat de SA_SIGINFO.

Folosind F_SETSIG cu o valoare diferita de 0, si setand SA_SIGINFO pentru handler-ul de semnal, informatia aditionala este trecuta catre handler intr-o structura siginfo_t. Daca avem campul si_code care ne indica ca sursa este SI_SIGIO atunci campul si_fd da fisierului descriptor fd care are asociat evenimentul respectiv notat event.

Altfel nu exista nici o alta indicatie despre care fisiere descriptor asteapta si atunci trebuie folosite mecanisem obisnuite( apeluri de sistem select, poll, read cu setul O_NONBLOCK) pt. a determina care fisiere descriptor sunt disponibile pt.operatii I/O.


Folosirea lui O_ASYNC, F_GETOWN, F_SETOWN este specifica pt. BSD si Linux.F_GETSIG si F_SETSIG  dupa cum ati observat sunt specifice SO Linux.


F_SETLEASE si F_GETLEASE (Linux 2.4 onwards) sunt folosite pt a stabili si regasi setarile curent ale apelarii proceselor ale fisierului referit de descriptorul de fisier fd.

F_SETLEASE -seteaza sau inlatura un fisier lease fctie de valorile specificate in intregul arg:


        F_RDLCK -citeste fisierul lease. Vom fi instintati cand un alt proces deschide fisierul si scrie sau il truncheaza.
   
        F_WRLCK -scrie fisierul lease. Vom fi instintati cand un alt proces deschide fisierul (pt.citire sau scriere) si il truncheaza. Un lease de scriere poate fi plasat pe un singur fisier daca alte procese nu au fisierul deschis deja.

           
        F_UNLCK -inlatura lease din fisier


In caz de succes valoarea intoarsa depinde de operatie:



F_DUPFD -noul descriptor

F_GETFD -valoarea flag-ului

F_GETFL -valoarea flag-urilor

F_GETOWN -valoarea proprietarului descriptorului

F_GETSIG -valoarea semnalului trimis cand citirea si scrierea devin posibile, sau 0 pt.comportamentul traditional al semnalului SIGIO


In caz de eroare valoarea -1 este intoarsa sau este setat un mesaj de eroare.



EACCES sau EAGAIN -operatia este interzisa de blocari detinute de alte procese sau operatia este interzisa deoarece fisierul a fost mapat in memorie de alte procese.
     
EBADF -descriptorul de fisier fd nu este un descriptor de fisier deschis sau comenzile au fost F_SETLK sau F_SETLKW si modul de deschidere al fisierului descriptor nu se potriveste cu tipul de blocare cerut
   
EDEADLK - a fost detectat ca o comanda specifica F_SETLKW va cauza un deadlock(o situatie de interblocare intre procese)


EFAULT - blocarea se afla in afara spatiului de adresa accesibil
   
EINTR- pt.F_SETLKW comanda a fost intrerupta de un semnal

-pt F_GETLIK si F_SETLK comanda a fost intrerupta de un semnal dupa ce blocarea a fost verificata sau achizitionata.

EINVAL -pt F_DUPFD , argumentul arg este <0 sau > decat nr.maxim de valori permise.

-pt.F_SETSIG, argumentul arg este un numar permis si asociat unui anumit semnal

 
EMFILE -pt. F_DUPFD procesul are deja numarul maxim de decriptori de fisier deschisi
   
ENOLCK -prea multe segmente de blocare deschise, tabelul de blocare este plin etc.
   
EPERM -incercare de a sterge flagul O_APPEND al unui fisier care si-a adaugat doar setul de atribute


_______________________________________
Cr3u$

pus acum 15 ani
   
Pagini: 1  

Mergi la