Kaj je deskriptor datotek?

Deskriptor datoteke je številka, ki enolično identificira odprto datoteko v operacijskem sistemu računalnika. Opisuje vir podatkov in način dostopa do tega vira.

Ko program odpre datoteko - ali drug vir podatkov, kot je omrežna vtičnica - jedro operacijskega sistema odobri dostop, vnese v globalno tabelo datotek in programski opremi lokacijo tega vnosa.

Deskriptor je označen z edinstvenim ne-negativnim številom, kot sta 0, 12 ali 567 . Za vsako odprto datoteko v sistemu obstaja vsaj en deskriptor datotek.

Datotečni deskriptorji so bili prvič uporabljeni v Unixu in jih uporabljajo sodobni operacijski sistemi, vključno z Linuxom, MacOS X in BSD. V operacijskem sistemu Microsoft Windows so opisniki datotek znani kot ročice datotek.

  • Pregled
  • Stdin, stdout in stderr
  • Preusmerjanje deskriptorjev datotek

Ko je proces uspešen, da odpre datoteko, jedro vrne deskriptor datoteke, ki kaže na vnos v globalno tabelo jedra. Vnos tabele datotek vsebuje informacije, kot so inode datoteke, odmik bajtov in omejitve dostopa za ta tok podatkov (samo za branje, samo za pisanje itd.).

Stdin, stdout in stderr

V operacijskem sistemu, podobnem Unixu, so prvi trije deskriptorji datotek privzeto STDIN (standardni vhod), STDOUT (standardni izhod) in STDERR (standardna napaka).

ImeDeskriptor datotekOpisOkrajšava
Standardni vhod0Privzeti tok podatkov za vnos, na primer v ukazni cevovod. V terminalu to privzeto vnese uporabnik s tipkovnico.stdin
Standardni izhod1Privzeti tok podatkov za izhod, na primer, ko ukaz natisne besedilo. V terminalu je to privzeto na uporabnikovem zaslonu.stdout
Standardna napaka2Privzeti tok podatkov za izhod, ki se nanaša na napako. V terminalu je to privzeto na uporabnikovem zaslonu.stderr

Preusmerjanje deskriptorjev datotek

Do deskriptorjev datotek lahko neposredno dostopate s pomočjo bash, privzete lupine za Linux, macOS X in podsistema Windows za Linux.

Na primer, ko uporabite ukaz find, uspešen izhod gre v stdout (deskriptor datoteke 1 ) in sporočila o napakah gredo v stderr (deskriptor datoteke 2 ). Oba toka se prikazujeta kot terminalski izhod:

 najdi / -ime "* nekaj *" 
 / usr / share / doc / nekaj / usr / share / doc / nekaj / examples / something_random najdi: `/ run / udisks2 ': Dovoljenje zavrnjeno:` / run / wpa_supplicant': Dovoljenje zavrnjeno / usr / share / something / usr / igre / nekaj 

Dobivamo napake, ker iskanje išče nekaj sistemskih imenikov, ki jih nimamo dovoljenja za branje. Vse vrstice, ki pravijo "Dovoljenje zavrnjeno", so bile zapisane v stderr, druge vrstice pa so bile zapisane v stdout .

Stderr lahko skrijete tako, da preusmerite deskriptor 2 datoteke v datoteko / dev / null, posebno napravo v Linuxu, ki "ne gre nikamor":

 find / -name '* something *' 2> / dev / null 
 / usr / share / doc / nekaj / usr / share / doc / nekaj / Primeri / something_random / usr / share / nekaj / usr / igre / nekaj 

Napake so bile poslane v / dev / null in niso prikazane.

Razumevanje razlike med stdout in stderr je pomembno, če želite delati z izhodom programa. Na primer, če poskusite narediti grep za ukaz find, boste opazili, da sporočila o napakah niso filtrirana, ker je samo gre za standardni izhod.

 find / -name '* something *' | grep "nekaj" 
 / usr / share / doc / nekaj / usr / share / doc / nekaj / examples / something_random najdi: `/ run / udisks2 ': Dovoljenje zavrnjeno:` / run / wpa_supplicant': Dovoljenje zavrnjeno / usr / share / something / usr / igre / nekaj 

Vendar pa lahko standardno napako preusmerite na standardni izhod, nato pa bo grep obdelal besedilo obeh:

 Najdi / -ime "* nekaj *" 2> & 1 | grep "nekaj" 
 / usr / share / doc / nekaj / usr / share / doc / nekaj / Primeri / something_random / usr / share / nekaj / usr / igre / nekaj 

Upoštevajte, da je v zgornjem ukazu ciljni deskriptor datoteke ( 1 ) predpono z znakom (" & "). Za več informacij o preusmerjanju podatkovnega toka glejte cevovode v lupini bash.

Za primere ustvarjanja in uporabe deskriptorjev datotek v bashu si oglejte primere ukazov exec.

Ročaj za datoteke, pogoji operacijskega sistema