een bestandsdescriptor is een getal dat een open bestand in het besturingssysteem van een computer uniek identificeert. 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 netwerksocket-verleent de kernel:
- toegang.
- maakt een ingang aan in de Globale Bestandstabel.
- geeft de software de locatie van dat item.
de descriptor wordt geïdentificeerd door een uniek niet-negatief geheel getal, zoals 0, 12 of 567. Er bestaat minstens één bestandsdescriptor voor elk open bestand op het systeem.
Bestandsdescriptoren werden voor het eerst gebruikt in Unix, en worden gebruikt door moderne besturingssystemen zoals Linux, macOS en BSD. In Microsoft Windows staan bestandsdescriptoren bekend als bestandshandvatten.
overzicht
wanneer een proces een succesvol verzoek doet om een bestand te openen, geeft de kernel een bestandsdescriptor terug die verwijst naar een item in de Globale Bestandstabel van de kernel. De ingang van de bestandstabel bevat informatie zoals de inode van het bestand, 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 bestandsdescriptoren standaard STDIN (standaardinvoer), STDOUT (standaarduitvoer) en STDERR (standaardfout).
naam | bestandsdescriptor | Description | Afkorting |
---|---|---|---|
standaardinvoer | 0 | de standaard datastroom voor invoer, bijvoorbeeld in een opdrachtpijplijn. In de terminal staat dit standaard op toetsenbordinvoer van de gebruiker. | stdin |
standaarduitvoer | 1 | de standaarddatastroom voor uitvoer, bijvoorbeeld wanneer een commando tekst afdrukt. In de terminal staat dit standaard op het scherm van de gebruiker. | stdout |
standaardfout | 2 | de standaarddatastroom voor uitvoer die betrekking heeft op een fout die optreedt. In de terminal staat dit standaard op het scherm van de gebruiker. | stderr |
omleiden van bestandsdescriptoren
Bestandsdescriptoren kunnen direct benaderd worden met bash, de standaard shell van Linux, macOS X en Windows subsysteem voor Linux.
bijvoorbeeld, wanneer u het commando find gebruikt, gaat succesvolle uitvoer naar stdout (bestandsdescriptor 1), en foutmeldingen naar stderr (bestandsdescriptor 2). Beide streams worden weergegeven als terminaluitvoer:
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
we krijgen fouten omdat find probeert te zoeken naar een paar systeemmappen die we niet kunnen lezen. Alle regels die zeggen “Toestemming geweigerd” werden geschreven naar stderr, en de andere regels werden geschreven naar stdout.
u kunt stderr verbergen door bestandsdescriptor 2 om te leiden naar /dev/null, het speciale apparaat in Linux dat “nergens heen gaat”:
find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
de fouten die naar /dev/null worden verzonden, worden niet weergegeven.
het verschil tussen stdout en stderr begrijpen is belangrijk wanneer u met de uitvoer van een programma wilt werken. Als je bijvoorbeeld de uitvoer van het find Commando grep probeert te maken, zul je merken dat de foutmeldingen niet gefilterd worden, omdat alleen de standaard uitvoer naar grep wordt doorgesluisd.
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
U kunt de standaardfout echter omleiden naar standaarduitvoer en dan zal grep de tekst van beide verwerken:
find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
merk op dat in het bovenstaande commando de doelbestanddescriptor (1) wordt voorafgegaan door een Ampersand (“&”). Zie pijpleidingen in de Bash-shell voor meer informatie over omleiding van gegevensstromen.
voor voorbeelden van het maken en gebruiken van bestandsdescriptoren in bash, zie onze Exec builtin Commando voorbeelden.
file handle, operating System terms