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/stdin
et /proc/self/fd/0
sont tous les liens vers /dev/pts/2
. S'agit-il de quatre descripteurs de fichiers ou de noms de fichiers?
Réponses:
Les quatre
/dev/fd/0
,/dev/stdin
,/proc/self/fd/0
et/dev/pts/2
sont 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/sh
est équivalent à///bin/sh
,/bin/../bin/sh
(en supposant qu'il/bin
s'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 lepipe
) et les sockets réseau ./dev/fd/0
,/dev/stdin
Et/proc/self/fd/0
sont 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 à appelerdup(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.la source
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.
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.
la source