Wanneer een programma vraagt om een bestand te openen - of een andere gegevensbron, zoals een netwerkaansluiting - verleent de kernel van het besturingssysteem toegang, maakt een vermelding in de algemene bestandstabel en verschaft de software de locatie van dat gegeven.
De descriptor wordt geïdentificeerd door een uniek niet-negatief geheel getal, zoals 0, 12 of 567 . Ten minste één bestandsdescriptor bestaat voor elk geopend bestand op het systeem.
Bestandsdescriptors werden voor het eerst gebruikt in Unix en worden gebruikt door moderne besturingssystemen, waaronder Linux, macOS X en BSD. In Microsoft Windows worden bestandsdescriptors bestandshandles genoemd.
- Overzicht
- Stdin, stdout en stderr
- Bestandsbeschrijving omleiden
Wanneer een proces een succesvol verzoek doet om een bestand te openen, retourneert de kernel een bestandsdescriptor die verwijst naar een item in de algemene bestandstabel van de kernel. De invoer van de bestandstabel bevat informatie zoals de inode van het bestand, de byte-offset en de toegangsbeperkingen voor die gegevensstroom (alleen-lezen, alleen-schrijven, enz.).
Stdin, stdout en stderr
Op een Unix-achtig besturingssysteem zijn de eerste drie bestandsdescriptors standaard STDIN (standaardinvoer), STDOUT (standaarduitvoer) en STDERR (standaardfout).
Naam | Bestandsdescriptor | Omschrijving | Afkorting |
---|---|---|---|
Standaard invoer | 0 | De standaard gegevensstroom voor invoer, bijvoorbeeld in een opdrachtpijplijn. In de terminal is dit standaard toetsenbordinvoer van de gebruiker. | stdin |
Standaard uitvoer | 1 | De standaardgegevensstroom voor uitvoer, bijvoorbeeld wanneer een opdracht tekst afdrukt. In de terminal is dit standaard op het scherm van de gebruiker. | stdout |
Standaardfout | 2 | De standaardgegevensstroom voor uitvoer die verband houdt met een optredende fout. In de terminal is dit standaard op het scherm van de gebruiker. | stderr |
Bestandsbeschrijving omleiden
Bestandsdescriptors kunnen direct worden benaderd met bash, de standaard shell van Linux, macOS X en Windows Subsystem for Linux.
Als u bijvoorbeeld de opdracht find gebruikt, gaat de succesvolle uitvoer naar stdout (bestandsdescriptor 1 ) en gaan foutberichten naar stderr (bestandsdescriptor 2 ). Beide streams worden weergegeven als terminaluitvoer:
vind / -naam '* iets *'
/ usr / share / doc / something / usr / share / doc / something / examples / something_random vinden: `/ run / udisks2 ': geweigerde toestemming te vinden:` / run / wpa_supplicant': geweigerde machtiging / usr / share / something / usr / games / iets
We krijgen fouten omdat zoeken probeert een aantal systeemdirectory's te doorzoeken waarvoor we geen toestemming hebben om te lezen. Alle regels die zeggen "Permission denied" zijn naar stderr geschreven en de andere regels zijn naar stdout geschreven.
Je kunt stderr verbergen door bestandsdescriptor 2 om te leiden naar / dev / null, het speciale apparaat in Linux dat "nergens naartoe gaat":
vind / -name '* something *' 2> / dev / null
/ usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / iets
De fouten zijn verzonden naar / dev / null en worden niet weergegeven.
Het verschil tussen stdout en stderr is belangrijk als u met de uitvoer van een programma wilt werken. Als u bijvoorbeeld de uitvoer van de opdracht find probeert te grepen, ziet u dat de foutmeldingen niet worden gefilterd, omdat alleen de standaarduitvoer wordt doorgestuurd naar grep .
find / -name '* something *' | grep 'iets'
/ usr / share / doc / something / usr / share / doc / something / examples / something_random vinden: `/ run / udisks2 ': geweigerde toestemming te vinden:` / run / wpa_supplicant': geweigerde machtiging / usr / share / something / usr / games / iets
U kunt standaardfouten echter omleiden naar standaarduitvoer en dan zal grep de tekst van beide verwerken:
zoek / -name '* something *' 2> & 1 | grep 'iets'
/ usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / iets
Merk op dat in de bovenstaande opdracht de doelbestanddescriptor ( 1 ) wordt voorafgegaan door een ampersand (" & "). Zie pijplijnen in de bashshell voor meer informatie over omleiding van gegevensstromen.
Zie onze exec ingebouwde opdrachtvoorbeelden voor voorbeelden van het maken en gebruiken van bestandsdescriptors in bash.
Bestandsafhandeling, besturingssysteemvoorwaarden