
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).
Ime | Deskriptor datotek | Opis | Okrajšava |
---|---|---|---|
Standardni vhod | 0 | Privzeti tok podatkov za vnos, na primer v ukazni cevovod. V terminalu to privzeto vnese uporabnik s tipkovnico. | stdin |
Standardni izhod | 1 | Privzeti tok podatkov za izhod, na primer, ko ukaz natisne besedilo. V terminalu je to privzeto na uporabnikovem zaslonu. | stdout |
Standardna napaka | 2 | Privzeti 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