un descriptor de fișiere este un număr care identifică în mod unic un fișier deschis în sistemul de operare al unui computer. Descrie o resursă de date și modul în care poate fi accesată acea resursă.
când un program cere să deschidă un fișier — sau o altă resursă de date, cum ar fi un soclu de rețea — nucleul:
- acordă acces.
- creează o intrare în tabelul de fișiere global.
- furnizează software-ului locația acelei intrări.
descriptorul este identificat printr-un număr întreg unic non-negativ, cum ar fi 0, 12 sau 567. Există cel puțin un descriptor de fișiere pentru fiecare fișier deschis din sistem.descriptorii de fișiere au fost utilizați pentru prima dată în Unix și sunt utilizați de sistemele de operare moderne, inclusiv Linux, macOS și BSD. În Microsoft Windows, descriptorii de fișiere sunt cunoscuți ca mânere de fișiere.
Prezentare generală
când un proces face o solicitare de succes pentru a deschide un fișier, nucleul returnează un descriptor de fișier care indică o intrare în tabelul de fișiere global al nucleului. Intrarea tabelului de fișiere conține informații precum inodul fișierului, offset de octeți și restricțiile de acces pentru fluxul de date respectiv (numai în citire, numai în scriere etc.).
Stdin, stdout și stderr
pe un sistem de operare asemănător Unix, primii trei descriptori de fișiere, în mod implicit, sunt STDIN (intrare standard), STDOUT (ieșire standard) și STDERR (eroare standard).
nume | descriptor fișier | descriere | abreviere |
---|---|---|---|
intrare Standard | 0 | fluxul de date implicit pentru intrare, de exemplu într-o conductă de comandă. În terminal, aceasta este implicită la introducerea tastaturii de la utilizator. | stdin |
ieșire Standard | 1 | fluxul de date implicit pentru ieșire, de exemplu atunci când o comandă imprimă text. În terminal, aceasta este implicită la ecranul utilizatorului. | stdout |
eroare Standard | 2 | fluxul de date implicit pentru ieșire care se referă la o eroare care apare. În terminal, aceasta este implicită la ecranul utilizatorului. | stderr |
redirecționarea descriptorilor de fișiere
descriptorii de fișiere pot fi accesați direct folosind bash, shell-ul implicit al subsistemului Linux, macOS X și Windows Pentru Linux.
de exemplu, când utilizați comanda find, ieșirea reușită merge la stdout (descriptor de fișier 1), iar mesajele de eroare merg la stderr (descriptor de fișier 2). Ambele fluxuri sunt afișate ca ieșire terminal:
find / -name '*something*'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
primim erori deoarece find încearcă să caute câteva directoare de sistem pe care nu avem permisiunea să le citim. Toate liniile care spun” permisiunea refuzată ” au fost scrise către stderr, iar celelalte linii au fost scrise către stdout.
puteți ascunde stderr redirecționând Descriptorul de fișiere 2 către/dev/null, dispozitivul special din Linux care „nu merge nicăieri”:
find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
Erorile trimise către/dev / null și nu sunt afișate.
înțelegerea diferenței dintre stdout și stderr este importantă atunci când doriți să lucrați cu ieșirea unui program. De exemplu, dacă încercați să grep ieșirea comenzii find, veți observa că mesajele de eroare nu sunt filtrate, deoarece numai ieșirea standard este transmisă la grep.
find / -name '*something*' | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
cu toate acestea, puteți redirecționa eroarea standard la ieșirea standard, iar apoi grep va procesa textul ambelor:
find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
observați că în comanda de mai sus, descriptorul fișierului țintă (1) este prefixat cu un ampersand („&”). Pentru mai multe informații despre redirecționarea fluxului de date, consultați conducte în shell-ul bash.
pentru exemple de creare și utilizare a descriptorilor de fișiere în bash, consultați exemplele de comandă exec builtin.
mâner fișier, Termeni de sistem de Operare