Wat is een bestandsdescriptor?

Een bestandsdescriptor is een nummer dat een uniek bestand identificeert in het besturingssysteem van een computer. Het beschrijft een gegevensbron en hoe die bron kan worden benaderd.

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).

NaamBestandsdescriptorOmschrijvingAfkorting
Standaard invoer0De standaard gegevensstroom voor invoer, bijvoorbeeld in een opdrachtpijplijn. In de terminal is dit standaard toetsenbordinvoer van de gebruiker.stdin
Standaard uitvoer1De standaardgegevensstroom voor uitvoer, bijvoorbeeld wanneer een opdracht tekst afdrukt. In de terminal is dit standaard op het scherm van de gebruiker.stdout
Standaardfout2De 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