
Když program požádá o otevření souboru - nebo jiného zdroje dat, jako je síťová zásuvka - jádro operačního systému udělí přístup, provede záznam v tabulce globálních souborů a poskytne software s umístěním této položky.
Deskriptor je identifikován jedinečným nezáporným celým číslem, například 0, 12 nebo 567 . Pro každý otevřený soubor v systému existuje alespoň jeden deskriptor souboru.
Deskriptory souborů byly poprvé použity v Unixu a používají se moderní operační systémy včetně Linuxu, MacOS X a BSD. V systému Microsoft Windows jsou popisovače souborů označovány jako popisovače souborů.
- Přehled
- Stdin, stdout a stderr
- Přesměrování deskriptorů souborů
Když proces provede úspěšnou žádost o otevření souboru, jádro vrátí popisovač souboru, který odkazuje na položku v globální tabulce souborů jádra. Záznam tabulky souborů obsahuje informace, jako je například inode souboru, posun bytů a omezení přístupu pro tento datový tok (pouze pro čtení, pouze pro zápis atd.).

Stdin, stdout a stderr
Na operačním systému podobném Unixu jsou první tři popisovače souborů standardně STDIN (standardní vstup), STDOUT (standardní výstup) a STDERR (standardní chyba).
název | Deskriptor souboru | Popis | Zkratka |
---|---|---|---|
Standardní vstup | 0 | Výchozí datový proud pro vstup, například v příkazovém řádku. V terminálu je toto výchozí nastavení pro vstup z klávesnice od uživatele. | stdin |
Standardní výstup | 1 | Výchozí datový proud pro výstup, například když příkaz vytiskne text. V terminálu je toto výchozí nastavení obrazovky uživatele. | stdout |
Standardní chyba | 2 | Výchozí datový proud pro výstup, který se týká chyby. V terminálu je toto výchozí nastavení obrazovky uživatele. | stderr |
Přesměrování deskriptorů souborů
K deskriptorům souborů lze přistupovat přímo pomocí bash, výchozího prostředí Linuxu, MacOS X a Windows Subsystem pro Linux.
Například, když použijete příkaz find, úspěšný výstup přejde do stdout (deskriptor souboru 1 ) a chybové zprávy přejdou na stderr (deskriptor souboru 2 ). Oba streamy se zobrazují jako výstup terminálu:
najít / -name '* něco *'
/ usr / share / doc / něco / usr / share / doc / something / examples / something_random find: `/ run / udisks2 ': Oprávnění bylo odmítnuto najít:` / run / wpa_supplicant': Oprávnění bylo odepřeno / usr / share / something / usr / games / něco
Dostáváme chyby, protože hledání se snaží vyhledat několik systémových adresářů, ke kterým nemáme oprávnění číst. Všechny řádky, které říkají "Oprávnění odepřeno" byly zapsány do stderr a ostatní řádky byly zapsány do stdout .
Stderr můžete skrýt přesměrováním deskriptoru souboru 2 na / dev / null, což je speciální zařízení v Linuxu, které "nikam nechodí":
najít / -name '* něco *' 2> / dev / null
/ usr / share / doc / něco / usr / share / doc / something / examples / something_random / usr / share / něco / usr / games / něco
Chyby byly odeslány do / dev / null a nezobrazují se.
Pochopení rozdílu mezi stdout a stderr je důležité, pokud chcete pracovat s výstupem programu. Pokud se například pokusíte grepovat výstup příkazu find, všimnete si, že chybová hlášení nejsou filtrována, protože pouze standardní výstup je piped do grep .
find / -name '* something *' | grep 'něco'
/ usr / share / doc / něco / usr / share / doc / something / examples / something_random find: `/ run / udisks2 ': Oprávnění bylo odmítnuto najít:` / run / wpa_supplicant': Oprávnění bylo odepřeno / usr / share / something / usr / games / něco
Standardní chybu však můžete přesměrovat na standardní výstup a pak grep zpracuje text obou:
najít / -name '* něco *' 2> & 1 | grep 'něco'
/ usr / share / doc / něco / usr / share / doc / something / examples / something_random / usr / share / něco / usr / games / něco
Všimněte si, že ve výše uvedeném příkazu je popisovač cílového souboru ( 1 ) předponou ampersand (" & "). Další informace o přesměrování datového toku naleznete v potrubí v prostředí bash.
Příklady vytváření a používání deskriptorů souborů v bash naleznete v našich příkladech příkazů exec builtin.
Popisovač souborů, podmínky operačního systému