web-dev-qa-db-fra.com

Comment la même FD dans différents processus peut-elle indiquer le même fichier?

Dis que j'ai processus 1 et 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 de la table de fichiers ouverts du noyau:

enter image description here

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

27
Pithikos

Le descripteur de fichier, c'est-à-dire le 4 Dans votre exemple, est l'indice dans la table descripteur de fichier spécifique au processus , non la table de fichiers ouverte. L'entrée de descripteur de fichier elle-même contient un index à une entrée dans la table de fichiers Open de Kernel, ainsi que des drapeaux de descripteur de fichier.

37
jw013

Chaque processus a sa propre table descripteur de fichier. Descripteur de fichier 4 dans le processus 1234 points à l'intérieur de la table du processus 1234. Descripteur de fichier 4 en cours 5678 points à l'intérieur du processus 5678 Un cas, il faut connaître les descripteurs de fichiers sont 0, 1 et 2 qui, pour chaque procédé sont l'entrée standard, la sortie standard et l'erreur standard, indiquant là où ils ont été redirigés vers.

Un processus peut ouvrir le même fichier plus d'une fois. Cela peut arriver avec coïncidence, par exemple lorsque la sortie standard et l'erreur standard d'un processus sont redirigées vers le même terminal ou vers le même fichier. Les entrées de la table de fichiers sous-jacents (par exemple Linux struct file ) porter plus que des informations sur le fichier; Ils contiennent également des modes d'ouverture (par exemple lire ou écrire) et d'autres états (tels que des indicateurs, E.G. Fermer-on-Exec). Par exemple, un processus peut avoir un terminal ouvert pour la lecture uniquement sur le descripteur de fichier 0 et que le même terminal ouvert pour écrire uniquement sur des descripteurs de fichier 2. Les entrées de tables de fichier contiennent également la position du processus dans le fichier; Un processus peut vouloir lseek à deux positions différentes dans le même fichier, d'utiliser dup pour obtenir deux poignées à ce fichier.

Chaque processus a sa propre table de descripteur de fichier. C'est tout.

Tout est très bien décrit dans Programmation de réseau UNIX de Richard Stevens si vous souhaitez l'apprendre profondément.

8
Michał Šrajer

Un niveau supplémentaire d'indirection ne ferait-il pas résoudre votre problème? ("Tous les problèmes de programmation informatique peuvent être résolus par un niveau supplémentaire d'indirection" - Quelques Wise Greybeard). C'est-à-dire que le petit entier de chaque processus se termine comme un indice dans une matrice per-traite d'index de l'espace de noyau dans la "Table de fichier ouverte".

7
Bruce Ediger