descripteur de fichier vs nom de fichier


12

Je me demandais quelles sont les différences et les relations entre les descripteurs de fichiers et les noms de fichiers. Sont-ils tous utilisés pour accéder aux fichiers? Si oui, de la même manière?

Par exemple, /dev/fd/0, /dev/stdinet /proc/self/fd/0sont tous les liens vers /dev/pts/2. S'agit-il de quatre descripteurs de fichiers ou de noms de fichiers?


Réponses:


12

Les quatre /dev/fd/0, /dev/stdin, /proc/self/fd/0et /dev/pts/2sont des noms de fichiers, tout comme /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijf, etc. Tout mais dernier exemple sont susceptibles d'être le nom d'un fichier existant sur votre machine. Un nom de fichier est une chaîne qui peut désigner un fichier sur votre système de fichiers; sous Linux, toute chaîne ne contenant pas d'octet nul et d'une longueur maximale de 4096 octets est un nom de fichier valide. Beaucoup de ces noms sont équivalents, par exemple /bin/shest équivalent à ///bin/sh, /bin/../bin/sh(en supposant qu'il /bins'agit d'un répertoire existant), etc. Tous les exemples que j'ai donnés jusqu'à présent sont des noms de fichiers absolus; il existe également des noms de fichiers relatifs, qui ne commencent pas par un /et dont la signification dépend du répertoire courant.

La terminologie entourant les noms de fichiers n'est pas universelle; parfois «nom de fichier» signifie un chemin d'accès complet à un fichier, et parfois cela signifie le nom d'une entrée de répertoire. La terminologie POSIX est « filename » ou « pathname component » pour le nom d'une entrée de répertoire et « pathname » pour un chemin complet.

Un descripteur de fichier désigne un fichier ouvert dans un processus particulier. Le noyau maintient une table de descripteurs de fichiers pour chaque processus. Chaque entrée du tableau des descripteurs de fichiers indique ce qu'il faut faire si le processus demande la lecture, l'écriture et d'autres opérations sur le descripteur de fichiers.

Les descripteurs de fichiers peuvent correspondre à un fichier et avoir un nom associé, mais pas tous. Pour ceux qui le font, le fichier peut être un fichier normal, un répertoire, un fichier de périphérique ou un canal nommé (également appelé FIFO) (le type créé par mkfifo); certains systèmes ont d'autres possibilités telles que les prises et les portes Unix. Des exemples de descripteurs de fichiers qui n'ont pas de fichier nommé associé incluent les canaux (le type créé par le pipe) et les sockets réseau .

/dev/fd/0, /dev/stdinEt /proc/self/fd/0sont des noms de fichiers (tous équivalents) avec un sens particulier: ils ont tous désigné selon le fichier est actuellement accessible via le descripteur de fichier 0. Lorsqu'un processus ouvre ceux - ci, les copies du noyau de la d'entrée avec l' index 0 dans le descripteur de fichier table de descripteurs à un nouveau descripteur. L'ouverture de l'un de ces fichiers équivaut à appeler dup(0). Les fichiers nommés sont un moyen d'obtenir indirectement un processus pour utiliser l'un de ses fichiers déjà ouverts plutôt que d'ouvrir un nouveau fichier; ils sont surtout utiles pour transmettre la ligne de commande d'un programme, où le programme attend le nom d'un fichier à ouvrir.


@Giles Vous avez écrit "Chaque entrée du tableau des descripteurs de fichiers indique ce qu'il faut faire si le processus demande la lecture, l'écriture et d'autres opérations sur le descripteur de fichiers." (C'est moi qui souligne ). Pour autant que je sache, il s'agit simplement d'un entier comme le standard 0,1,2 etc. pour stdin, stdout et stderr respectivement. Il s'agirait de nombres de valeur plus élevée pour les fichiers ordinaires. Ce que je n'obtiens pas de votre commentaire, c'est comment ce nombre indique «que faire si le processus demande la lecture, l'écriture et d'autres opérations sur le descripteur de fichier». . Pouvez-vous s'il vous plaît développer un peu cela?
Geek

@Geek Une entrée dans la table des descripteurs de fichiers n'est pas un nombre. Le nombre est l'index dans cette table.
Gilles 'SO- arrête d'être méchant'

@Giles merci pour la clarification de mon malentendu. Je le comprends mieux maintenant. Pouvez-vous donc donner un exemple de la partie «que faire» dans votre réponse? J'ai compris que chaque entrée dans la table des descripteurs de fichiers a de nouveau un pointeur vers une table de fichiers qui contient des informations telles que l'offset de fichier, l'état du fichier, etc.
Geek

2

Le nom de fichier n'est qu'un nom du fichier sur le système de fichiers, rien de plus - c'est juste une chaîne.

Le descripteur de fichier est une sorte d'objet, d'où vous pouvez lire et / ou écrire. Ce fichier est ouvert et prêt. Il n'y a pas seulement des descripteurs de fichiers - stdin, stdout et stderr sont également des descripteurs, vous pouvez les écrire et les lire en utilisant absolument les mêmes fonctions qu'avec les fichiers (sauf que vous ne pouvez pas par exemple rechercher). D'autres exemples de descripteurs qui ne sont pas des fichiers sont: les canaux nommés et les sockets réseau.

Dans le code, le descripteur de fichier est une variable, pointeur vers quelque chose dans le noyau, qui représente un objet fichier.

Par exemple, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 sont tous des liens vers / dev / pts / 2. S'agit-il de quatre descripteurs de fichiers ou de noms de fichiers?

Ce sont tous des pseudo-fichiers, qui peuvent être utiles pour certains scripts ou programmes. Vous pouvez les ouvrir et open () vous retournerait un descripteur de fichier.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.