a file descriptors is a number that uniqually identifying a open file in a computer ’ s operating system. Siinä kuvataan tietoresurssia ja sitä, miten kyseistä resurssia voidaan käyttää.
kun ohjelma pyytää avaamaan tiedoston — tai muun dataresurssin, kuten verkkopistokkeen — ydin:
- myöntää pääsyn.
- luo merkinnän globaaliin tiedostotaulukkoon.
- ilmoittaa ohjelmistolle kyseisen merkinnän sijainnin.
asiasana yksilöidään yksikäsitteisellä ei-negatiivisella kokonaisluvulla, kuten 0, 12 tai 567. Jokaista järjestelmän avointa tiedostoa kohden on olemassa vähintään yksi tiedostokuvaaja.
Tiedostokuvauksia käytettiin ensimmäisen kerran Unixissa, ja niitä käyttävät nykyaikaiset käyttöjärjestelmät kuten Linux, macOS ja BSD. Microsoft Windowsissa tiedostokuvaajia kutsutaan tiedostokahvoiksi.
yleiskatsaus
kun prosessi pyytää onnistuneesti tiedoston avaamista, ydin palauttaa tiedostokuvauksen, joka viittaa ytimen globaalissa tiedostotaulukossa olevaan tietueeseen. Tiedostotaulukossa on tietoja, kuten tiedoston inodi, tavun siirtymä ja kyseisen datavirran pääsyrajoitukset (vain luku, vain kirjoitus jne.).
Stdin, stdout ja stderr
Unixin kaltaisessa käyttöjärjestelmässä kolme ensimmäistä tiedostokuvausta ovat oletuksena STDIN (standard input), STDOUT (standard output) ja STDERR (standard Error).
Name | File descriptor | Description | lyhenne |
---|---|---|---|
Standardisyöte | 0 | syötön oletusdatavirta, esimerkiksi komentoputkistossa. Päätelaitteessa tämä oletusarvo on käyttäjän näppäimistösyöttö. | stdin |
Standardituloste | 1 | lähtötiedon oletusvirta, esimerkiksi komennon tulostaessa tekstiä. Päätteessä tämä oletusarvo siirtyy käyttäjän näytölle. | stdout |
keskivirhe | 2 | tulosteen oletustietovirta, joka liittyy tapahtuneeseen virheeseen. Päätteessä tämä oletusarvo siirtyy käyttäjän näytölle. | stderr |
Uudelleenohjaamalla tiedostokuvauksia
Tiedostokuvauksia voidaan käyttää suoraan käyttämällä bashia, Linuxin oletuskuorta, macOS X: ää ja Linuxin Windows-alijärjestelmää.
esimerkiksi, kun käytät etsi-komentoa, onnistunut ulostulo menee stdoutiin (tiedostokuvaus 1) ja virheilmoitukset menevät stderr: iin (tiedostokuvaus 2). Molemmat streamit näkyvät päätepisteenä:
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
saamme virheitä, koska find yrittää etsiä muutamia järjestelmähakemistoja, joita meillä ei ole lupaa lukea. Kaikki rivit, joissa lukee ”Permission denied”, kirjoitettiin stderrille ja muut rivit stdoutille.
stderr: n voi piilottaa ohjaamalla tiedostokuvauksen 2 Linuxin erikoislaitteeseen/dev/null, joka ”ei mene minnekään”:
find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
virheet, jotka lähetetään/dev / null: iin, ja joita ei näytetä.
Stdoutin ja stderr: n eron ymmärtäminen on tärkeää, kun haluat työskennellä ohjelman ulostulolla. Jos esimerkiksi yrität käyttää Etsi-komennon tulostetta grep, huomaat, että virheilmoituksia ei suodateta, koska vain vakiotuloste johdetaan grep: hen.
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
voidaan kuitenkin ohjata keskivirhe vakiotulosteeseen, jolloin grep käsittelee molempien tekstin:
find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
huomaa, että yllä olevassa komennossa kohdetiedoston kuvaaja (1) etuliitteenä on Ampersand (”&”). Lisätietoja datavirran uudelleenohjauksesta on Bash-komentotulkin putkistoissa.
esimerkkejä tiedostojen kuvaajien luomisesta ja käyttämisestä Bashissa, katso exec builtin-komentoesimerkit.
Tiedostokahva, Käyttöjärjestelmätermit