Faila deskriptors



Failu deskriptoru ilustrācija

TO faila deskriptors ir skaitlis, kas unikāli identificē atvērto failu datorā operētājsistēma . Tas apraksta datu resursu un to, kā šim resursam var piekļūt.



Kad programma lūdz atvērt failu vai citu datu resursu, piemēram, tīkla ligzdu, kodolu:

  1. Piešķir piekļuvi.
  2. Izveido ierakstu globālo failu tabulā.
  3. Programmatūrai nodrošina šī ieraksta atrašanās vietu.

Aprakstītāju identificē ar unikālu nenegatīvu veselu skaitli, piemēram, 0, 12 vai 567. Katram atvērtam failam sistēmā pastāv vismaz viens faila deskriptors.



Failu deskriptori pirmo reizi tika izmantoti Unix , un tos izmanto mūsdienu operētājsistēmas, ieskaitot Linux , macOS un BSD . In Microsoft Windows , failu deskriptori ir pazīstami kā failu rokturi.

zibatmiņas disks ir aizsargāts pret rakstīšanu

Pārskats

Kad process veiksmīgi pieprasa atvērt failu, kodols atgriež faila deskriptoru, kas norāda uz ierakstu kodola globālo failu tabulā. Failu tabulas ierakstā ir informācija, piemēram, faila inode, baitu nobīde un piekļuves ierobežojumi šai datu straumei (tikai lasāms, tikai rakstāms utt.).

Faila deskriptora diagramma

Stdin, stdout un stderr

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

kā pārbaudīt vēsturi datorā
Nosaukums Faila deskriptors Apraksts Abreviatūra
Standarta ievade 0 Noklusējuma datu plūsma ievadei, piemēram, komandu cauruļvadā. Terminālā tas pēc noklusējuma ir lietotāja ievadīta tastatūra. stdin
Standarta izeja 1 Izvades noklusējuma datu straume, piemēram, kad komanda izdrukā tekstu. Terminālā tas noklusē lietotāja ekrānu. stdout
Standarta kļūda divi Izvades noklusējuma datu plūsma, kas saistīta ar radušos kļūdu. Terminālā tas noklusē lietotāja ekrānu. stderr

Notiek failu deskriptoru novirzīšana

Failu aprakstiem var tieši piekļūt, izmantojot bash , Linux, macOS X un Linux apakšsistēmas noklusējuma čaula Linux.

Piemēram, kad izmantojat atrast komanda, veiksmīga izvade nonāk stdout (faila deskriptors 1) un kļūdu ziņojumi stderr (faila deskriptors 2). Abas straumes tiek rādītas kā termināla izeja:

find / -name '*something*'
/usr/share/doc/something /usr/share/doc/something/examples/something_random find: '/run/udisks2': Permission denied find: '/run/wpa_supplicant': Permission denied /usr/share/something /usr/games/something

Mēs saņemam kļūdas, jo Find mēģina meklēt dažus sistēmas direktorijus, kuru mums nav atļauju Lasīt. Visas rindas, kurās teikts “Atļauja liegta”, tika ierakstītas stderr, bet pārējās - stdout.

Jūs varat paslēpt stderr, novirzot faila deskriptoru 2 uz / dev / null, Linux īpašo ierīci, kas 'nekur nenokļūst':

kāds ir mans akumulatora līmenis
find / -name '*something*' 2>/dev/null
/usr/share/doc/something /usr/share/doc/something/examples/something_random /usr/share/something /usr/games/something

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

Izpratne par atšķirību starp stdout un stderr ir svarīga, ja vēlaties strādāt ar programmas izvadi. Piemēram, ja jūs mēģināt saķere komandas find izvadi, jūs pamanīsit, ka kļūdu ziņojumi netiek filtrēti, jo tikai standarta izeja tiek novirzīta uz grep.

find / -name '*something*' | grep 'something'
/usr/share/doc/something /usr/share/doc/something/examples/something_random find: '/run/udisks2': Permission denied find: '/run/wpa_supplicant': Permission denied /usr/share/something /usr/games/something

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

find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something /usr/share/doc/something/examples/something_random /usr/share/something /usr/games/something

Ievērojiet, ka iepriekšminētajā komandā mērķa faila deskriptoram (1) ir prefikss ar ampersandu ('&'). Plašāku informāciju par datu plūsmas novirzīšanu skatiet cauruļvadi bash apvalkā .

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