Ce este un Descriptor de fișiere?

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ă această resursă.

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).

NumeDescriptor de fișiereDescriereAbreviere
Intrare standard0Fluxul 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 standard1Fluxul 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 standard2Fluxul 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