descriptor fișier
descriptor File - este un întreg fără semn, folosind un proces pentru a deschide fișierul. Numărul de descriptori de fișiere disponibile la un proces este limitat de parametrul / OPEN_MAX, stabilit în sys / fișier limits.h. În plus, numărul de descriptori de fișier poate fi setat utilizând ulimit pavilion comandă -n. descriptorii de fișiere sunt deschise în exercitarea funcțiilor. pipe. și fcntl creat. De obicei, fiecare proces funcționează cu un set unic de descriptori. Cu toate acestea, aceste etichete pot fi folosite și de procese pentru copii create cu ajutorul funcției de furcă. În plus, descriptorii pot fi copiate cu ajutorul funcțiilor Fontal. DUP și dup2.
Toate fișierele deschise se referă la miezul prin intermediul așa-numitelor descriptori de fișier. descriptor File - este un număr întreg non-negativ. Când deschidem un fișier existent și de a crea un nou fișier, nucleul returnează un proces descriptor fișier.
Implicit UNIX -shelly fișier asociat descriptor 0 la intrarea standard a procesului (terminal), fisierul 1 - iesirea standard (terminal) și un descriptor de fișier 2 - eroarea standard (adică, în cazul în care sunt afișate erorile). Acest acord este observat de multe -shellami și multe aplicații UNIX - și în nici un caz nu este parte a kernel-ului.
POSIX.1 înlocuiește standard "numere magice" 0,1,2 constante simbolice STDIN_FILENO, STDOUT_FILENO și STDERR_FILENO respectiv.
descriptorii de fișiere pot lua valori de la 0 la OPEN_MAX. Versiunile mai vechi de UNIX au o limită superioară 19, permițând un proces să se deschidă la 20 de fișiere. Acum, această valoare a crescut la câteva mii.
tratări de fișiere servi ca tabel descriptor index, care se află în u_block și a creat nucleul pentru fiecare proces. Cel mai adesea, procesul primește descriptorii de operațiunile deschise și CREAT. și prin moștenind de la procesul părinte. În tabelul de funcționare descriptor furcă este copiat în procesul de copil. Ca rezultat al procesului de copil devine dreptul de a accesa fișierele procesului părinte.
fișier tabel descriptor și sistemul tabelelor de fișiere deschise
structură de date care conține o listă de fișiere deschise și lista de descriptori de fișier care vă permit să urmăriți acces la fișiere și pentru a asigura integritatea datelor.
Tabelul de fișiere descriptori
Traduce un număr de index (descriptor de fișier) în indicii pentru a deschide fișiere. Pentru fiecare proces în u_block a creat propria tabelă descriptorilor. Fiecare intrare a acestui tabel conține următoarele câmpuri: steagurile și indicatorul de fișier. Nu mai mult de descriptori de fișier OPEN_MAX. tabelul descriptor de fișier are următoarea structură:
Tabelul de fișiere deschise
Acesta conține înregistrări cu informații despre toate fișierele deschise. Intrarea acestui tabel este păstrat curent compensat pentru fișierul care este utilizat pentru toate operațiunile de citire și scriere într-un fișier și deschideți fișierul (O_RDONLY, O_WRONLY sau O_RDWR). În structura tabelului de fișiere deschise stocate în offsetul fișierului. Când operația de citire-scriere, sistemul efectuează o schimbare de indicator implicit. De exemplu, când citirea și scrierea bytes x pointer va fi mutat la x octeți. Pentru a schimba poziția cursorului în fișiere cu acces direct se aplică caută funcția. Pentru streaming de fișiere (cum ar fi țevi și prize de curent), conceptul de deplasare nu este acceptată, deoarece accesul aleatoriu la dosar nu este.
Managementul fișierelor descriptori
Deoarece fișierele pot ocupa de mai mulți utilizatori, este necesar să se permită proceselor conexe, cu o deplasare totală de indicatorul și procese independente - cu propriile sale de compensare pointer la un fișier. Deschis tabela fișier conține un număr de referință fișier care reflectă numărul de descriptori care corespund unui anumit fișier.
Mai multe referințe la dosar pot fi solicitate în următoarele cazuri:
- Fișierul este deschis chiar și un singur proces
- Procesul de copil moștenește descriptorii de fișiere deschise de procesul parinte
- descriptor fișier este copiat folosind fcntl funcție sau DUP
Activitatea comună cu fișiere deschise
La fiecare pas de deschidere record adăugat la masa de fișiere deschise. Acest lucru asigură că fiecare proces va rula cu cursorul în fișierul. O astfel de abordare permite de a menține integritatea datelor.
La copierea unui descriptor de două procese încep să lucreze cu același indice. În acest caz, ambele procese pot încerca să acceseze fișierul în același timp, datele vor fi citite sau scrise, nu este consecvent.
Există următoarele metode de a copia descriptor de fișier: DUP funcție sau dup2. funcția de furcă și fcntl funcția.
Funcții DUP și dup2
Funcția DUP creează o copie a fișierului descriptor. Copia este generată în spațiul gol din tabelul descriptor de fișier care conține utilizator descriptor sursă. A incremente DUP contelui de referință al fișierului în tabela deschis fișier și returnează un nou descriptor de fișier. Funcția dup2 găsește mânerul solicitat și închide fișierul asociat, în cazul în care acesta este deschis. Cu ajutorul ei, puteți specifica o anumită înregistrare a tabelului, în care mânerul trebuie să fie copiat.
Funcția de furcă
Funcția de furcă creează un proces copil care moștenește toate mânerele procesului părinte. După aceea, procesul de copil începe un nou proces. descriptori Moștenit pavilion strânsă cu exec, set cu fcntl. Acestea vor fi închise.
funcţia fcntl
Funcția fcntl vă permite să lucrați cu structura de date a descriptorilor de fișiere și fișiere deschise. Acesta vă permite să faceți următorul descriptor:- Copiați fișierul descriptor (identic cu funcția DUP).
- Obțineți sau setați valoarea de aproape de pavilion de la Exec.
- Descriptorilor modul oprit pentru blocuri.
- Inclusiv modul de completare a datelor la dosar (O_APPEND).
- Include procese trimiterea de semnal de rezoluție de intrare-ieșire.
- Setați și pentru a obține ID-ul de proces sau grupul de proces pentru a trimite SIGIO.
- Închideți toate descriptorii de fișiere.
descriptori de fișier standard
Când executați un program în coajă se deschide trei descriptori 0, 1 și 2. În mod implicit, acestea sunt asociate cu următoarele fișiere:
mesaje de eroare standard.
Acești descriptori de fișier asociat cu terminalul. Acest lucru înseamnă că, atunci când citirea datelor dintr-un descriptor de 0 program de fișier de intrare primește de la terminalul, iar atunci când datele sunt scrise la dosar descriptori 1 și 2, acestea sunt afișate pe terminal. Când deschideți alți descriptori de fișiere sunt atribuite în ordine crescătoare.
În cazul în care accesul este direcționat prin intermediul operatorilor <(знак меньше) или> (Mai mare), descriptorii standard, asociate cu alte fișiere. De exemplu, următoarea comandă leagă descriptorii de fișier 0 și 1, fișierele necesare (în mod implicit, acești descriptori sunt conectate cu terminalul).
În acest exemplu, descriptor 0 va fi asociat cu un fișier FileX, și un mâner 1 - cu fișierul Filey. Descriptor 2 nu va fi modificată. Programul este suficient să se știe că mânerul 0 este fișierul de intrare, și descriptori 1 și 2 - fișierele de ieșire. Informații despre ce fișiere specifice asociate cu aceste tag-uri, nu are nevoie.
Următorul exemplu arată programul standard de ieșire redirecționare:
La primirea cererii de descriptorul este alocat primul descriptor disponibil din tabelul descriptor (descriptor cu cel mai mic număr). Cu toate acestea, funcțiile de fișiere DUP pot fi atribuite la orice mâner.