Kas ir failu deskriptors?

Failu deskriptors ir numurs, kas unikāli identificē atvērtu failu datora operētājsistēmā. Tā apraksta datu avotu un to, kā var piekļūt šim resursam.

Ja programma lūdz atvērt failu - vai citu datu resursu, piemēram, tīkla ligzdu - operētājsistēmas kodols piešķir piekļuvi, veic ierakstu globālajā datņu tabulā un nodrošina programmatūru ar šī ieraksta atrašanās vietu.

Deskriptors tiek identificēts ar unikālu ne-negatīvu veselu skaitli, piemēram, 0, 12 vai 567 . Katram atvērtam failam sistēmā ir vismaz viens failu deskriptors.

Failu deskriptorus pirmo reizi izmantoja Unix, un tos izmanto mūsdienīgas operētājsistēmas, tostarp Linux, MacOS X un BSD. Microsoft Windows faila apraksti ir pazīstami kā failu rokturi.

  • Pārskats
  • Stdin, stdout un stderr
  • Failu deskriptoru novirzīšana

Kad process ir veiksmīgi pieprasījis atvērt failu, kodols atgriež faila deskriptoru, kas norāda uz koda globālā faila tabulas ierakstu. Failu tabulas ierakstā ir informācija, piemēram, faila inode, baita nobīde un piekļuves ierobežojumi šai datu plūsmai (tikai lasāms, tikai rakstīšanai utt.).

Stdin, stdout un stderr

Unix tipa operētājsistēmā pirmie trīs failu apraksti pēc noklusējuma ir STDIN (standarta ievade), STDOUT (standarta izeja) un STDERR (standarta kļūda).

NosaukumsFailu deskriptorsAprakstsSaīsinājums
Standarta ievade0Noklusējuma datu plūsma ievadei, piemēram, komandu cauruļvadā. Terminālā tas ir noklusējuma iestatījums no lietotāja tastatūras.stdin
Standarta izeja1Noklusējuma datu plūsma izvadīšanai, piemēram, ja komanda izdrukā tekstu. Terminālā tas ir lietotāja ekrāna noklusējums.stdout
Standarta kļūda2Noklusējuma datu plūsma izvadam, kas attiecas uz kļūdu. Terminālā tas ir lietotāja ekrāna noklusējums.stderr

Failu deskriptoru novirzīšana

Failu aprakstus var tieši piekļūt, izmantojot bash, Linux, MacOS X un Linux apakšsistēmas noklusējuma apvalku.

Piemēram, ja izmantojat meklēšanas komandu, veiksmīga izeja tiek veikta uz stdout (faila deskriptors 1 ), un kļūdu ziņojumi tiek nosūtīti uz stderr (faila deskriptors 2 ). Abas plūsmas tiek rādītas kā termināla izeja:

 atrast / -name 'kaut ko *' 
 / usr / share / doc / something / usr / share / doc / kaut kas / piemēri / something_random atrast: `/ run / udisks2 ': Atļauja liegta:` / run / wpa_supplicant': Atļauja liegta / usr / share / something / usr / spēles / kaut kas 

Mēs saņemam kļūdas, jo atrast mēģina meklēt dažus sistēmas direktorijus, kuriem nav atļaujas lasīt. Visas rindas, kas saka: "Atļauja liegta", tika rakstītas stderr, un pārējās līnijas tika rakstītas uz stdout .

Jūs varat paslēpt stderr, novirzot faila deskriptoru 2 uz / dev / null, īpašu ierīci Linux, kas "iet nekur":

 atrast / -name '* kaut ko *' 2> / dev / null 
 / usr / share / doc / kaut kas / usr / share / doc / kaut kas / piemēri / something_random / usr / share / kaut kas / usr / spēles / kaut kas 

Kļūdas ir nosūtītas uz / dev / null, un tās netiek parādītas.

Izpratne starp stdout un stderr atšķirībām ir svarīga, ja vēlaties strādāt ar programmas izeju. Piemēram, ja jūs mēģināt grep par atrast komandu, jūs pamanīsiet, ka kļūdas ziņojumi netiek filtrēti, jo tikai standarta izejas tiek piegādātas uz grep .

 atrast / -name '* kaut ko *' grep "kaut ko" 
 / usr / share / doc / something / usr / share / doc / kaut kas / piemēri / something_random atrast: `/ run / udisks2 ': Atļauja liegta:` / run / wpa_supplicant': Atļauja liegta / usr / share / something / usr / spēles / kaut kas 

Tomēr standarta kļūdu var novirzīt uz standarta izeju, un pēc tam grep apstrādās abu tekstu:

 atrast / -name '* kaut ko *' 2> & 1 | grep "kaut ko" 
 / usr / share / doc / kaut kas / usr / share / doc / kaut kas / piemēri / something_random / usr / share / kaut kas / usr / spēles / kaut kas 

Ņemiet vērā, ka iepriekš minētajā komandā mērķa faila deskriptors ( 1 ) ir pievienots ar amplitūdu (" & "). Plašāku informāciju par datu plūsmas novirzīšanu skatiet cauruļvados bash apvalkā.

Piemēri, kā izveidot un izmantot failu aprakstus bash, skatiet mūsu exec iebūvēto komandu piemērus.

Failu rokturis, operētājsistēmas noteikumi