en file descriptor er et tall som unikt identifiserer en åpen fil i datamaskinens operativsystem. Den beskriver en dataressurs, og hvordan denne ressursen kan nås.
når et program ber om å åpne en fil — eller en annen dataressurs, som en nettverkskontakt — gir kjernen:
- tilgang.
- Oppretter en oppføring i den globale filtabellen.
- Gir programvaren med plasseringen av denne oppføringen.
beskrivelsen identifiseres med et unikt ikke-negativt heltall, for eksempel 0, 12 eller 567. Det finnes minst en filbeskrivelse for hver åpen fil på systemet.Filbeskrivelser ble først brukt I Unix, og brukes av moderne operativsystemer, Inkludert Linux, macOS og BSD. I Microsoft Windows er filbeskrivelser kjent som filhåndtak.
Oversikt
når en prosess gjør en vellykket forespørsel om å åpne en fil, returnerer kjernen en filbeskrivelse som peker til en oppføring i kjernens globale filtabell. Filtabelloppføringen inneholder informasjon som inoden til filen, byteforskyvning og tilgangsbegrensningene for den datastrømmen(skrivebeskyttet, skrivebeskyttet osv.).
Stdin, stdout og stderr
på Et Unix-lignende operativsystem er DE tre første filbeskrivelsene SOM standard STDIN (standard input), STDOUT (standard output) og STDERR (standard error).
Navn | Filbeskrivelse | Forkortelse | |
---|---|---|---|
Standardinngang | 0 | standard datastrøm for inndata, for eksempel i en kommandorørledning. I terminalen er dette standard for tastaturinngang fra brukeren. | |
Standard utgang | 1 | standard datastrøm for utdata, for eksempel når en kommando skriver ut tekst. I terminalen er dette standard på brukerens skjerm. | stdout |
Standardfeil | 2 | standard datastrøm for utdata som er relatert til en feil som oppstår. I terminalen er dette standard på brukerens skjerm. | stderr |
Omdirigering av filbeskrivelser
Filbeskrivelser kan nås direkte ved hjelp av bash, standardskallet Til Linux, macOS X og Windows-Delsystem For Linux.
når du for eksempel bruker finn-kommandoen, går vellykket utgang til stdout (file descriptor 1), og feilmeldinger går til stderr (file descriptor 2). Begge strømmene vises som terminalutgang:
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
vi får feil fordi find prøver å søke i noen systemkataloger som vi ikke har tillatelse til å lese. Alle linjene som sier «Tillatelse nektet» ble skrevet til stderr, og de andre linjene ble skrevet til stdout.
du kan skjule stderr ved å omdirigere file descriptor 2 til /dev / null, den spesielle enheten I Linux som «går ingensteds»:
find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
feilene sendt til /dev/null, og vises ikke.Forstå forskjellen mellom stdout og stderr er viktig når du vil arbeide med et program utgang. Hvis du for eksempel prøver å gripe utdataene fra finn-kommandoen, vil du legge merke til at feilmeldingene ikke filtreres, fordi bare standardutgangen sendes til 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
du kan imidlertid omdirigere standardfeil til standardutgang, og deretter grep vil behandle teksten til begge:
find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
Legg merke til at i kommandoen ovenfor er målfilbeskrivelsen (1) prefikset med en ampersand («&»). Hvis du vil ha mer informasjon om omadressering av datastrøm, kan du se rørledninger i bash-skallet.
for eksempler på å lage og bruke filbeskrivelser i bash, se våre exec builtin command eksempler.
filhåndtak, Vilkår For Operativsystem