7
votes

Combien d'informations est réellement stockée dans un descripteur de fichier?

Cela peut sembler une question étrange, mais lorsque je vais ouvrir un fichier: xxx

Qu'est-ce que je suis de retour exactement? Je peux voir la page de l'homme dit:

La fonction Open () doit renvoyer un descripteur de fichier pour le fichier nommé qui est le descripteur de fichier le plus bas qui n'est pas actuellement ouvert pour ce processus

mais c'est qu'il? Est-ce juste un int ou y a-t-il des données attachées dans les coulisses? La raison pour laquelle je demande est de trouver du code (Linux / c) où nous ouvrons le fichier à partir de l'espace utilisateur: xxx

puis sur l'extrémité du noyau, le fichier Opérations de ce module (qui fournit la FD) La carte se lit dans la fonction n_read () Fonction: xxx

puis le descripteur de fichier est utilisé dans le < code> n_read () , mais il est accessible pour obtenir des données: xxx

donc ... je pense que ce qui se passe ici est soit: < p> a) Un descripteur de fichier renvoyé à partir de ouvert () contient plus de données que d'une valeur entière descriptive
Ou de
B) le mappage entre un appel à "lire" dans l'espace utilisateur n'est pas aussi simple que je ne le fais pas et il manque un certain code dans cette équation.

Toute entrée qui pourrait aider dirige-moi?


2 commentaires

Où est fquit déclaré? Et oui, les descripteurs de fichiers ne sont que des entiers. Toute information sur eux doit être obtenue avec un appel système à partir de la table descripteur de fichier du noyau.


@ user1700513 - Vous pouvez assumer fquite est 0.


3 Réponses :


1
votes

Je pense que c'est juste un int . De wikipedia :

En règle générale, un descripteur de fichier est un index pour une entrée dans une structure de données de noyau-résident contenant les détails de tous les fichiers ouverts. Dans POSIX, cette structure de données s'appelle une table descripteur de fichier et chaque processus a sa propre table descripteur de fichier.


0 commentaires

3
votes

En plus de la bonne réponse existante de @Nominal Aminal, il s'agit d'un entier, mais il pointe une entrée d'une structure dans le noyau appelée table descripteur de fichier. C'est au moins le cas avec Linux. Des différents champs faisant partie de cette structure, une personne intéressante est la suivante:

FILE * pointer; // descriptor to / from reference counts etc.


3 commentaires

Table descripteur de fichier , Table de fichier Ouvrir le système : Publib.Boulder.ibm.com/infocenter/Series/v5r3/index.jsp?top ic = / ...


Structures de données du noyau pour les fichiers ouverts : CIM.MCGILL.CA/~Franco/opsys-304-427/Lecture-notes/node27.htm l


Ceci est complètement incorrect. Sous Linux, le fichier * utilisé par standard I / O (et fileno () et fdopen () ) n'a rien à voir avec le noyau Fichier de struct , sauf peut-être une similitude de passage de nom.



10
votes

Descripteur de fichier n'est qu'un int . Le noyau l'utilise comme un index sur une table contenant toutes les informations associées, y compris la position du fichier, les ops de fichiers (fonctions du noyau qui fournissent le lue () , écriture () , mmap () etc. syscalls), etc.

Lorsque vous Ouvrir () Un fichier ou un périphérique, le noyau crée une nouvelle entrée de descripteur de fichier pour votre processus et renseigne les données internes, y compris le fichier OPS.

Lorsque vous utilisez lisez () , écriture () , mmap () , etc. avec un descripteur de fichier valide, le noyau Tout simplement Recherchez la fonction correcte dans le noyau à appeler en fonction du fichier OPS de la table descripteur de fichier (et quels index de descripteur de fichier). C'est vraiment aussi simple.


1 commentaires

Merci, belle explication simple ... Je pense que j'essayais d'essayer de compliquer cela pour moi-même. :)