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:
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?
kernel
open-files
file-descriptors
Pithikos
la source
la source
4
dans les deux processus est relatif à son propre nombre de fd ouverts. Les Fd0-2
(stdin, stdout, sdterr) sont toujours ouverts pour un nouveau processus et les numéros ne sont pas réservés à ce seul processus.Réponses:
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.la source
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 Linux
struct 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 vouloirlseek
deux positions différentes dans le même fichier, et donc utiliserdup
pour obtenir deux descripteurs de ce fichier.la source
dup
fait 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.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.
la source
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».
la source