Comment un même fd dans différents processus peut-il pointer vers le même fichier?

25

Disons que j'ai le processus 1 et le processus 2 . Les deux ont un descripteur de fichier correspondant à l'entier 4.

Dans chaque processus, cependant, le descripteur de fichier 4 pointe vers un fichier totalement différent dans la table des fichiers ouverts du noyau:

entrez la description de l'image ici

Comment est-ce possible? Un descripteur de fichier n'est-il pas censé être l'index d'un enregistrement dans la table de fichiers ouverts?

Pithikos
la source
1
Bonne question! Je suppose que les descripteurs de fichiers sont traduits, de sorte que le fd 4dans les deux processus est relatif à son propre nombre de fd ouverts. Les Fd 0-2(stdin, stdout, sdterr) sont toujours ouverts pour un nouveau processus et les numéros ne sont pas réservés à ce seul processus.
@ jw013 Je pensais que cela semblait familier. \ @Pithikos Comment n'est-ce pas un doublon?
Michael Mrozek
1
Ceci est un diagramme médiocre - il devrait montrer que le descripteur de fichier 4 signifie la quatrième entrée [enfin, cinquième, il est compté à partir de zéro] de la table des descripteurs de fichier sur la gauche, pas une entrée qui contient un "4". Le "4" réel réside dans votre variable d'espace utilisateur contenant le nombre. Le diagramme de l'autre question est bien meilleur.
Random832
2
@ Random832 Eh bien, si je savais quel diagramme était correct, je n'aurais probablement jamais posé cette question.
Pithikos

Réponses:

35

Le descripteur de fichier, c'est- 4à- dire le dans votre exemple, est l'index dans la table de descripteur de fichier spécifique au processus , pas la table de fichier ouverte. L'entrée de descripteur de fichier elle - même contient un index d'une entrée dans la table de fichiers ouverts globale du noyau, ainsi que des indicateurs de descripteur de fichier.

jw013
la source
2
Pour mémoire, il n'y a qu'un seul "indicateur de descripteur de fichier" sur la plupart des systèmes, l'indicateur close-on-exec. Tous les autres états "par fd" (y compris le décalage et le mode d'accès) font partie de l'entrée de la table de fichiers ouverts.
Random832
24

Chaque processus a sa propre table de descripteurs de fichiers. Le descripteur de fichier 4 dans le processus 1234 pointe dans la table du processus 1234. Le descripteur de fichier 4 en cours 5678 pointe à l'intérieur de la table du processus 5678. Un cas que vous devez connaître est les descripteurs de fichiers 0, 1 et 2 qui, pour chaque processus, sont l'entrée standard, la sortie standard et l'erreur standard, pointant là où ils ont été redirigés.

Un processus peut ouvrir plusieurs fois le même fichier. Cela peut arriver par hasard, par exemple lorsque la sortie standard d'un processus et l'erreur standard sont redirigées vers le même terminal ou vers le même fichier. Les entrées de table de fichiers sous-jacentes (par exemple Linuxstruct file ) contiennent plus que des informations sur le fichier; ils contiennent également des modes d'ouverture (par exemple en lecture ou en écriture) et d'autres états (tels que des drapeaux, par exemple close-on-exec). Par exemple, un processus peut avoir un terminal ouvert pour la lecture uniquement sur le descripteur de fichier 0 et ce même terminal ouvert pour l'écriture uniquement sur le descripteur de fichier 2. Les entrées des tables de fichiers contiennent également la position du processus dans le fichier; un processus peut vouloir lseekdeux positions différentes dans le même fichier, et donc utiliser duppour obtenir deux descripteurs de ce fichier.

Gilles 'SO- arrête d'être méchant'
la source
2
Ce n'est pas tout à fait correct. Selon la page de manuel / spécifications, dupfait exactement ce qu'il dit sur l'étain: les deux descripteurs résultants pointent vers la même entrée de table de fichiers et partagent ainsi le même décalage. Pour obtenir 2 entrées de table de fichiers différentes, je suis sûr que vous devezopen du fichier deux fois.
jw013
@Gilles "Le descripteur de fichier 4 dans le processus 1234 pointe dans la table du processus 1234". De quelle table parlez-vous? D'après ce que je sais, la seule table du processus est la table des descripteurs de fichiers où chaque enregistrement pointe vers la seule table de fichiers ouverts du noyau .
Pithikos
Voir unix.stackexchange.com/questions/195057/… pour une description plus précise.
Gilles 'SO- arrête d'être méchant'
8

Chaque processus a sa propre table de descripteurs de fichiers. C'est tout.

Tout cela est très bien décrit dans UNIX Network Programming par Richard Stevens si vous souhaitez l'apprendre en profondeur.

Michał Šrajer
la source
De quel tableau parlez-vous?
Pithikos
1
table de descripteurs de fichiers
Michał Šrajer
7

Un niveau supplémentaire d'indirection ne résoudrait-il pas votre problème? ("Tous les problèmes de programmation informatique peuvent être résolus par un niveau supplémentaire d'indirection" - certains barbe sage). C'est-à-dire que le petit entier de chaque processus se termine en tant qu'index dans un tableau par processus d'index d'espace noyau dans la «table de fichiers ouverts».

Bruce Ediger
la source
2
Le barbe grise à la source est probablement David Wheeler. Il semble qu'il ait également dit: " Mais cela créera généralement un autre problème. " :)
jw013