popisovač souboru je číslo, které jednoznačně identifikuje otevřený soubor v operačním systému počítače. Popisuje datový zdroj a způsob přístupu k tomuto zdroji.
když program požádá o otevření souboru – nebo jiného datového zdroje, jako je síťový socket-jádro:
- uděluje přístup.
- vytvoří položku v globální tabulce souborů.
- poskytuje softwaru umístění 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í je moderní operační systémy včetně Linuxu, macOS a BSD. V systému Microsoft Windows jsou deskriptory souborů známé jako popisovače souborů.
Přehled
Když proces je úspěšný požadavek na otevření souboru, jádro se vrátí popisovač souboru, který ukazuje na záznam v jádru globální tabulky souborů. Soubor, záznam v tabulce obsahuje informace, jako je například inode souboru, byte offset, a omezení přístupu pro daný datový tok (pouze pro čtení, pouze pro zápis, atd.).
Stdin, stdout, a stderr
Na Unix-like operační systém, první tři popisovačů souboru, ve výchozím nastavení, jsou STDIN (standardní vstup), STDOUT (standardní výstup) a STDERR (standardní chyba).
Jméno | deskriptoru Souboru | Popis | Zkratka |
---|---|---|---|
Standardní vstup | 0 | výchozí datový proud pro vstup, například v příkazovém potrubí. V terminálu je výchozí hodnota vstupu 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í na obrazovce uživatele. | stdout |
Standardní chyba | 2 | výchozí datový proud pro výstup, který se vztahuje k chybě. V terminálu je toto výchozí nastavení na obrazovce uživatele. | stderr |
Přesměrování popisovače souboru
Soubor deskriptorů může být přímo přístupné pomocí bash, default shell pro Linux, macOS X a Windows Subsystém pro Linux.
například, když použijete příkaz najít, úspěšný výstup jde na standardní výstup (deskriptor souboru 1), a chybové zprávy, jít na stderr (deskriptor souboru 2). Oba proudy se zobrazí jako výstup na terminál:
find / -name '*something*'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
dostáváme se chyby, protože najít se snaží hledat několik adresářů systému, že nemáme oprávnění ke čtení. Všechny řádky, které říkají „povolení odepřeno“, byly zapsány do stderr, a ostatní řádky byly zapsány do stdout.
můžete skrýt tím, že přesměruje stderr deskriptor souboru 2 do /dev/null, speciální zařízení v Linuxu, že „nikam nevede“:
find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
chyby poslal do /dev/null, a nejsou zobrazeny.
pochopení rozdílu mezi stdout a stderr je důležité, pokud chcete pracovat s výstupem programu. Pokud se například pokusíte grep výstup příkazu Najít, všimnete si, že chybové zprávy nejsou filtrovány, protože pouze standardní výstup je potrubím do grep.
find / -name '*something*' | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
Nicméně, můžete přesměrovat standardní chybový na standardní výstup, a pak grep bude zpracovávat text:
find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
Všimněte si, že v příkazu výše, cílový soubor deskriptor (1) je předponou s ampersand („&“). Pro více informací o přesměrování datového toku, viz potrubí v bash shellu.
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