
Keď program požiada o otvorenie súboru - alebo iný zdroj údajov, ako napríklad sieťová zásuvka - jadro operačného systému udelí prístup, urobí záznam v globálnej tabuľke súborov a poskytne softvér s umiestnením tejto položky.
Deskriptor je identifikovaný jedinečným nezáporným celým číslom, ako napríklad 0, 12 alebo 567 . Pre každý otvorený súbor v systéme existuje aspoň jeden deskriptor súboru.
Deskriptory súborov boli prvýkrát použité v Unixe a používajú ich moderné operačné systémy vrátane Linuxu, MacOS X a BSD. V systéme Microsoft Windows sú popisovače súborov známe ako popisovače súborov.
- Prehľad
- Stdin, stdout a stderr
- Presmerovanie deskriptorov súborov
Keď proces úspešne požiada o otvorenie súboru, jadro vráti deskriptor súboru, ktorý ukazuje na položku v globálnej tabuľke súborov jadra. Záznam tabuľky súborov obsahuje informácie, ako napríklad inode súboru, posunutie bajtov a obmedzenia prístupu pre tento dátový tok (len na čítanie, len na zápis atď.).

Stdin, stdout a stderr
Na operačnom systéme podobnom Unixu sú prvé tri deskriptory súborov štandardne STDIN (štandardný vstup), STDOUT (štandardný výstup) a STDERR (štandardná chyba).
názov | Deskriptor súboru | popis | Skratka |
---|---|---|---|
Štandardný vstup | 0 | Predvolený dátový tok pre vstup, napríklad v príkazovom riadku. V termináli sa predvolene nastavuje vstup klávesnice od používateľa. | stdin |
Štandardný výstup | 1 | Predvolený dátový tok pre výstup, napríklad keď príkaz tlačí text. V termináli sa predvolene nastaví obrazovka používateľa. | stdout |
Štandardná chyba | 2 | Predvolený dátový tok pre výstup, ktorý sa týka chyby. V termináli sa predvolene nastaví obrazovka používateľa. | stderr |
Presmerovanie deskriptorov súborov
K deskriptorom súborov je možné pristupovať priamo pomocou bash, štandardného shell Linuxu, MacOS X a Subsystému Windows pre Linux.
Napríklad, keď použijete príkaz find, úspešný výstup prejde na stdout (deskriptor súboru 1 ) a chybové hlásenia prejdú na stderr (deskriptor súboru 2 ). Oba streamy sa zobrazujú ako výstup terminálu:
nájsť / -name '* niečo *'
/ usr / share / doc / niečo / usr / share / doc / niečo / examples / something_random find: `/ run / udisks2 ': Oprávnenie bolo zamietnuté nájsť:` / run / wpa_supplicant': Povolenie bolo zamietnuté / usr / share / something / usr / hry / niečo
Dostávame chyby, pretože vyhľadávanie sa pokúša vyhľadať niekoľko systémových adresárov, na ktoré nemáme povolenie na čítanie. Všetky riadky, ktoré hovoria, že "povolenie bolo zamietnuté" boli zapísané do stderr a ostatné riadky boli zapísané do stdout .
Stderr môžete skryť presmerovaním deskriptora súboru 2 na / dev / null, špeciálnym zariadením v Linuxe, ktoré "nikam nevedie":
nájsť / -name '* niečo *' 2> / dev / null
/ usr / share / doc / something / usr / share / doc / niečo / examples / something_random / usr / share / niečo / usr / games / niečo
Chyby boli odoslané na adresu / dev / null a nezobrazujú sa.
Pochopenie rozdielu medzi stdout a stderr je dôležité, ak chcete pracovať s výstupom programu. Ak sa napríklad pokúsite grepovať výstup príkazu find, všimnete si, že chybové hlásenia nie sú filtrované, pretože iba štandardný výstup je pripojený na grep .
find / -name '* something *' | grep 'niečo'
/ usr / share / doc / niečo / usr / share / doc / niečo / examples / something_random find: `/ run / udisks2 ': Oprávnenie bolo zamietnuté nájsť:` / run / wpa_supplicant': Povolenie bolo zamietnuté / usr / share / something / usr / hry / niečo
Štandardnú chybu však môžete presmerovať na štandardný výstup a potom grep spracuje text oboch:
nájsť / -name '* niečo *' 2> & 1 | grep 'niečo'
/ usr / share / doc / something / usr / share / doc / niečo / examples / something_random / usr / share / niečo / usr / games / niečo
Všimnite si, že vo vyššie uvedenom príkaze je deskriptor cieľového súboru ( 1 ) predponou ampersand (" & "). Ďalšie informácie o presmerovaní toku údajov nájdete v potrubí v prostredí bash.
Príklady vytvárania a používania deskriptorov súborov v bash nájdete v príkladoch príkazov exec builtin.
Popisovač súborov, podmienky operačného systému