Atunci când un program cere să deschidă un fișier - sau o altă resursă de date, cum ar fi un socket de rețea - kernelul sistemului de operare permite accesul, face o intrare în tabela de fișiere globală și furnizează software-ului locația respectivei intrări.
Descriptorul este identificat de un întreg unic non-negativ, cum ar fi 0, 12 sau 567 . Cel puțin un descriptor de fișiere există pentru fiecare fișier deschis din sistem.
Descriptorii de fișiere au fost folosiți pentru prima oară în Unix și sunt folosiți de sisteme de operare moderne, inclusiv Linux, MacOS X și BSD. În Microsoft Windows, descriptorii de fișiere sunt cunoscuți sub numele de mânere de fișiere.
- Prezentare generală
- Stdin, stdout și stderr
- Redirecționarea descriptorilor de fișiere
Atunci când un proces face o cerere de succes pentru a deschide un fișier, kernelul returnează un descriptor de fișier care indică o intrare în tabela de fișiere globală a kernel-ului. Înregistrarea tabelului de fișiere conține informații cum ar fi inodul fișierului, octetul offset și restricțiile de acces pentru acel flux de date (numai pentru citire, scriere, etc.).
Stdin, stdout și stderr
Pe un sistem de operare similar cu sistemul Unix, primii trei descriptori de fișiere, în mod implicit, sunt STDIN (intrare standard), STDOUT (ieșire standard) și STDERR (eroare standard).
Nume | Descriptor de fișiere | Descriere | Abreviere |
---|---|---|---|
Intrare standard | 0 | Fluxul de date implicit pentru intrare, de exemplu într-o conductă de comandă. În terminal, aceasta implică introducerea de la tastatură de la utilizator. | stdin |
Emisie 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 Linux, macOS X și Windows Subsystem for Linux.
De exemplu, atunci când utilizați comanda de căutare, ieșirea de succes merge la stdout (descriptorul de fișier 1 ), iar mesajele de eroare ajung la stderr (descriptor de fișier 2 ). Ambele fluxuri sunt afișate ca ieșiri terminale:
găsi / -name "* ceva *
/ usr / share / doc / ceva / usr / share / doc / ceva / exemple / something_random găsi: `/ run / udisks2 ': Permisiunile refuzate găsesc: / / run / wpa_supplicant': Permis refuz / usr / share / something / usr / jocuri / ceva
Obținerea erorilor, deoarece găsim că încercăm să căutăm câteva directoare de sistem pe care nu avem permisiunea să le citim. Toate rândurile care spun "permisiunea a fost respinsă" au fost scrise la stderr, iar celelalte linii au fost scrise la stdout .
Puteți ascunde stderr redirecționând descriptorul de fișiere 2 la / dev / null, dispozitivul special din Linux care "nu merge nicăieri":
găsi / -name "* ceva *" 2> / dev / null
/ usr / share / doc / ceva / usr / share / doc / ceva / exemple / ceva_random / usr / share / ceva / usr / jocuri / ceva
Erori au fost trimise la / 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ă grepați ieșirea comenzii find, veți observa că mesajele de eroare nu sunt filtrate, deoarece numai ieșirea standard este conectată la grep .
găsiți / -name '* ceva *' | grep "ceva"
/ usr / share / doc / ceva / usr / share / doc / ceva / exemple / something_random găsi: `/ run / udisks2 ': Permisiunile refuzate găsesc: / / run / wpa_supplicant': Permis refuz / usr / share / something / usr / jocuri / ceva
Cu toate acestea, puteți redirecționa eroarea standard la ieșirea standard, iar apoi grep va procesa textul ambelor:
găsiți / -name '* ceva *' 2 '& 1 | grep "ceva"
/ usr / share / doc / ceva / usr / share / doc / ceva / exemple / ceva_random / usr / share / ceva / usr / jocuri / ceva
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 conductele din shell-ul bash.
Pentru exemple de creare și folosire a descriptorilor de fișiere în bash, consultați exemplele de comandă exec builtin.
File handle, Termeni de sistem de operare