Čo je to deskriptor súboru?

Deskriptor súboru je číslo, ktoré jednoznačne identifikuje otvorený súbor v operačnom systéme počítača. Opisuje zdroj údajov a spôsob prístupu k tomuto zdroju.

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ázovDeskriptor súborupopisSkratka
Štandardný vstup0Predvolený 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ýstup1Predvolený 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á chyba2Predvolený 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