Descripteur de fichier

Mise à jour: 13/03/2021 par Computer Hope

Illustration des descripteurs de fichier

Un descripteur de fichier est un nombre qui identifie de manière unique un fichier ouvert dans le système d’exploitation d’un ordinateur. Il décrit une ressource de données et la manière dont elle peut être consultée.

Lorsqu’un programme demande d’ouvrir un fichier — ou une autre ressource de données, comme un socket réseau – le noyau :

  1. Accorde l’accès.
  2. Crée une entrée dans la table de fichiers globale.
  3. Fournit au logiciel l’emplacement de cette entrée.

Le descripteur est identifié par un entier unique non négatif, tel que 0, 12 ou 567. Il existe au moins un descripteur de fichier pour chaque fichier ouvert sur le système.

Les descripteurs de fichiers ont d’abord été utilisés sous Unix, et sont utilisés par les systèmes d’exploitation modernes, notamment Linux, macOS et BSD. Sous Microsoft Windows, les descripteurs de fichiers sont appelés poignées de fichiers.

Aperçu

Lorsqu’un processus fait une demande d’ouverture de fichier réussie, le noyau renvoie un descripteur de fichier qui pointe vers une entrée dans la table de fichiers globale du noyau. L’entrée de la table de fichiers contient des informations telles que l’inode du fichier, le décalage des octets et les restrictions d’accès pour ce flux de données (lecture seule, écriture seule, etc.).

Diagramme des descripteurs de fichier

Stdin, stdout et stderr

Sur un système d’exploitation de type Unix, les trois premiers descripteurs de fichier, par défaut, sont STDIN (entrée standard), STDOUT (sortie standard) et STDERR (erreur standard).

Nom Descripteur de fichier Description Abréviation
Entrée standard 0 Le flux de données par défaut pour l’entrée, par exemple dans un pipeline de commandes. Dans le terminal, la valeur par défaut est la saisie au clavier de l’utilisateur. stdin
Sortie standard 1 Le flux de données par défaut pour la sortie, par exemple lorsqu’une commande imprime du texte. Dans le terminal, cela correspond par défaut à l’écran de l’utilisateur. sortie standard
Erreur standard 2 Le flux de données par défaut pour la sortie qui se rapporte à une erreur se produisant. Dans le terminal, cela correspond par défaut à l’écran de l’utilisateur. stderr

Redirection des descripteurs de fichiers

Les descripteurs de fichiers peuvent être directement accessibles à l’aide de bash, le shell par défaut de Linux, macOS X et le Sous-système Windows pour Linux.

Par exemple, lorsque vous utilisez la commande find, la sortie réussie va à stdout (descripteur de fichier 1) et les messages d’erreur vont à stderr (descripteur de fichier 2). Les deux flux s’affichent en sortie de terminal:

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

Nous obtenons des erreurs car find essaie de rechercher quelques répertoires système que nous n’avons pas l’autorisation de lire. Toutes les lignes qui disent « Permission refusée » ont été écrites sur stderr, et les autres lignes ont été écrites sur stdout.

Vous pouvez masquer stderr en redirigeant le descripteur de fichier 2 vers /dev/null, le périphérique spécial sous Linux qui « ne va nulle part » :

find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something

Les erreurs envoyées à /dev/null, et ne sont pas affichées.

Comprendre la différence entre stdout et stderr est important lorsque vous souhaitez travailler avec la sortie d’un programme. Par exemple, si vous essayez de grep la sortie de la commande find, vous remarquerez que les messages d’erreur ne sont pas filtrés, car seule la sortie standard est acheminée vers 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

Cependant, vous pouvez rediriger l’erreur standard vers la sortie standard, puis grep traitera le texte des deux :

find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something

Notez que dans la commande ci-dessus, le descripteur de fichier cible (1) est préfixé par une esperluette (« & »). Pour plus d’informations sur la redirection de flux de données, consultez pipelines dans le shell bash.

Pour des exemples de création et d’utilisation de descripteurs de fichiers dans bash, consultez nos exemples de commandes intégrées exec.

Poignée de fichier, Termes du système d’exploitation

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.