qu'est-ce que Linux FD

青灯夜游
Libérer: 2023-04-13 09:24:17
original
9418 Les gens l'ont consulté

Sous Linux, le nom complet de fd est "File descriptor", et le nom chinois est "file descriptor". C'est un index créé par le noyau afin de gérer efficacement ces fichiers ouverts ; entier, utilisant Pour faire référence à un fichier ouvert, tous les appels système qui effectuent des opérations d'E/S sont implémentés via des descripteurs de fichier.

qu'est-ce que Linux FD

L'environnement d'exploitation de ce tutoriel : système linux7.3, ordinateur Dell G3.

Sous Linux, le nom complet de fd est "Descripteur de fichier" et le nom chinois est "Descripteur de fichier". Un descripteur de fichier est un entier non négatif, essentiellement une valeur d'index (cette phrase est très importante).

Descripteur de fichier (fd) sous Linux

Nous savons que tout dans le système Linux peut être considéré comme un fichier et que les fichiers peuvent être divisés en : fichiers ordinaires, fichiers de répertoire, fichiers de liens et fichiers de périphérique. Lors de l'exploitation de ces soi-disant fichiers, nous devons trouver le nom à chaque fois que nous opérons, ce qui consomme beaucoup de temps et d'efficacité. Par conséquent, Linux stipule que chaque fichier correspond à un index, donc lorsque nous voulons exploiter un fichier, nous pouvons directement trouver l'index et l'exploiter.

Le descripteur de fichier est un index créé par le noyau afin de gérer efficacement ces fichiers ouverts. Il s'agit d'un entier non négatif (généralement un petit entier) utilisé pour faire référence au fichier ouvert. Les opérations O sont implémentées via des descripteurs de fichiers. Dans le même temps, il est également stipulé que lorsque le système vient de démarrer, 0 est l'entrée standard, 1 est la sortie standard et 2 est l'erreur standard. Cela signifie que si vous ouvrez un nouveau fichier à ce moment-là, son descripteur de fichier sera 3, et si vous ouvrez un autre fichier, le descripteur de fichier sera 4...

Le noyau Linux a une description de fichier pour tous les fichiers ouverts. table de descripteurs, qui stocke la relation entre chaque descripteur de fichier sous forme d'index et de fichier ouvert. Une compréhension simple est un tableau comme indiqué ci-dessous. Le descripteur de fichier (index) est l'indice du tableau dans la table des descripteurs de fichiers. le contenu est constitué de pointeurs pour ouvrir les fichiers un par un.

quest-ce que Linux FD

Ce qui précède n'est qu'une simple compréhension. En fait, concernant les descripteurs de fichiers, le noyau Linux maintient 3 structures de données :

  • Table des descripteurs de fichiers au niveau du processus
  • Table des descripteurs de fichiers ouverts au niveau du système
  • La table i-node du système de fichiers

Après le démarrage d'un processus Linux, un bloc de contrôle PCB sera créé dans l'espace du noyau. Il y a une table de descripteurs de fichiers à l'intérieur du PCB, qui enregistre toutes les descriptions de fichiers disponibles du courant. symbole de processus, c'est-à-dire tous les fichiers ouverts du processus en cours. Chaque entrée du tableau des descripteurs au niveau du processus enregistre des informations sur le descripteur de fichier utilisé par un seul processus. Les processus sont indépendants les uns des autres. Si un processus utilise le descripteur de fichier 3, un autre processus peut également utiliser 3. En plus de la table des descripteurs de fichiers au niveau du processus, le système doit également gérer deux autres tables : la table des fichiers ouverts et la table des i-nodes. Ces deux tables stockent le descripteur de fichier ouvert de chaque fichier ouvert. Un descripteur de fichier ouvert stocke toutes les informations relatives à un fichier ouvert.

Table de descripteurs de fichiers ouverts au niveau du système :

  • Décalage du fichier actuel (mis à jour lors de l'appel de read() et write(), ou modifié directement à l'aide de lseek())
  • Identification à l'ouverture du fichier (open (paramètre flags of))
  • Mode d'accès aux fichiers (tels que le mode lecture seule, le mode écriture seule ou le mode lecture-écriture défini lors de l'appel d'open())
  • Paramètres liés au pilote de signal
  • L'objet fichier i-node Une référence à le pointeur de la table i-node

La table i-node du système de fichiers :

  • Type de fichier (par exemple : fichier normal, socket ou FIFO) et autorisations d'accès
  • Un pointeur vers le fichier Liste des verrous détenu
  • Divers attributs du fichier, y compris la taille du fichier et les horodatages liés aux différents types d'opérations

La relation entre les descripteurs de fichiers, les descripteurs de fichiers ouverts et les i-nodes est la suivante :

quest-ce que Linux FD

  • Dans le processus A, les descripteurs de fichiers 1 et 20 pointent tous deux vers la même entrée de table de fichiers ouverts, étiquetée 23 (pointant vers l'élément de tableau avec l'index 23 dans la table de fichiers ouverts), ce qui peut être en appelant dup() , dup2( ), fcntl() ou plusieurs appels à la fonction open() sur le même fichier.
  • Le descripteur de fichier 2 du processus A et le descripteur de fichier 2 du processus B pointent tous deux vers le même fichier. Cela peut se produire après l'appel de fork() (c'est-à-dire que les processus A et B sont des relations de processus parent-enfant), ou ils peuvent l'être. différent. Le processus appelle la fonction open() seule pour ouvrir le même fichier. À ce stade, le descripteur à l'intérieur du processus est attribué au même descripteur utilisé par d'autres processus pour ouvrir le fichier.
  • Le descripteur 0 du processus A et le descripteur 3 du processus B pointent respectivement vers différentes entrées de la table de fichiers ouverts, mais ces entrées de table pointent vers la même entrée dans la table i-node (étiquetée 1976) ; même un fichier. Cela se produit parce que chaque processus effectue son propre appel open() vers le même fichier. Une situation similaire se produira si le même processus ouvre deux fois le même fichier.

Cela signifie : différents descripteurs de fichiers d'un même processus peuvent pointer vers le même fichier ; différents processus peuvent avoir le même descripteur de fichier ; le même descripteur de fichier de différents processus peut pointer vers des fichiers différents (c'est généralement le cas, dans en plus des trois fichiers spéciaux 0, 1 et 2) ; différents descripteurs de fichiers de différents processus peuvent également pointer vers le même fichier.

Exemple d'ouverture d'un fichier sous Linux

Par exemple, utilisez vim test.py sous Linux Ouvrez un fichier, gardez-le ouvert, puis ouvrez un nouveau shell, entrez la commande pidof vim Get le numéro pid du processus vim, puis ll /proc/$pid/fd pour afficher la liste des descripteurs de fichiers utilisés par le processus vim.

/dev/pts est le répertoire où se trouvent les fichiers du périphérique de console créés après la connexion à distance (telnet, ssh, etc.). Parce que je me suis connecté à distance via Xshell, les descripteurs de fichiers de l'entrée standard 0, de la sortie standard 1 et de l'erreur standard 2 pointent tous vers la console du terminal virtuel /dev/pts/6. Regardez le descripteur de fichier du test.py nouvellement ouvert ci-dessous. Il s'avère qu'il s'agit de 4. Avez-vous accepté de commencer à partir de 3 ?

Cela me dérange depuis longtemps. Après avoir vérifié diverses informations, j'ai finalement trouvé la raison dans un forum avec l'aide d'un grand patron. Parfois, si vous ne trouvez pas en chinois, il faut essayer un. Recherche en anglais. Car le principe d'un éditeur comme vim est d'abord d'ouvrir le fichier source et de le copier, puis de fermer le fichier source puis d'ouvrir votre propre copie. Après avoir modifié le fichier et l'avoir enregistré, renommez directement la copie et écrasez le fichier source. Ainsi, lors de l'ouverture du fichier source, utilisez le descripteur de fichier 3, puis ouvrez votre propre copie. Il est temps d'utiliser le descripteur de fichier 4. Fermez ensuite le fichier source, et le descripteur de fichier 3 est libéré. Lors de la vérification, il ne reste que 4, qui pointe ici vers le fichier de copie créé par vim. Ceci n'est qu'une idée générale. Pour approfondir le principe d'implémentation de vim - Oort Nebula Ambassador, voici une capture d'écran des informations sur le forum que j'ai vues à ce moment-là, le lien est ici : StackOverFlow.

quest-ce que Linux FD

Si vous n'y croyez pas, vous pouvez essayer un autre processus, comme la queue.

Ouvrez un fichier sous Linux avec tail -f test.py Gardez-le ouvert, puis ouvrez un nouveau shell, entrez la commande pidof tail Obtenez le numéro pid du processus tail, puis ll /proc/$ pid/fd Vérifiez la liste des descripteurs de fichiers utilisés par le processus tail. Vous pouvez voir que les descripteurs de fichiers sont effectivement utilisés à partir du 3. Tail ne modifie pas le fichier dans l'éditeur, le fichier source est donc ouvert directement à l'aide du descripteur de fichier. Vous pouvez en fait utiliser la commande ll /proc/$pid/fd pour obtenir l'utilisation du descripteur de fichier de tout processus en cours d'exécution.

Connaissances approfondies : système de configuration Linux nombre maximum de descripteurs de fichiers ouverts

(1) Restrictions au niveau du système

Théoriquement, vous pouvez ouvrir autant de descripteurs de fichiers que la mémoire système en possède, mais en pratique, le noyau le gérera en conséquence. Généralement, le nombre maximum de fichiers ouverts sera de 10 % de la mémoire système (calculée en Ko), ce qui correspond à 10 % de la mémoire système. est appelé Restrictions au niveau du système. Ce numéro peut être consulté via la commande cat /proc/sys/fs/file-max ou sysctl -a | grep fs.file-max.

Il existe deux façons de modifier les restrictions au niveau du système : les modifications temporaires et les modifications permanentes :

  • Modifications temporaires : les valeurs des paramètres d'origine seront restaurées après la déconnexion de la session ou le redémarrage du système. Utilisez la commande sysctl -w fs.file-max=xxxx, où xxxx est le nombre à définir.

  • Changement permanent : vim édite le fichier /etc/sysctl.conf et ajoute fs.file-max=xxxx à la fin, où xxxx est le numéro à définir. Après avoir enregistré et quitté, utilisez la commande sysctl -p pour la faire prendre effet.

(2) Restrictions au niveau de l'utilisateur

Dans le même temps, afin de contrôler les ressources de fichiers consommées par chaque processus, le noyau définira également une limite par défaut sur le nombre maximum de fichiers ouverts pour un seul processus, c’est-à-dire les restrictions au niveau de l’utilisateur. La valeur par défaut pour les systèmes 32 bits est généralement 1024 et la valeur par défaut pour les systèmes 64 bits est généralement 65535. Vous pouvez utiliser la commande ulimit -n pour l'afficher.

Il existe deux façons de modifier les restrictions au niveau de l'utilisateur : les modifications temporaires et les modifications permanentes :

  • Modifications temporaires : les valeurs des paramètres d'origine seront restaurées après la déconnexion de la session ou le redémarrage du système. Utilisez la commande ulimit -SHn xxxx pour le modifier, où xxxx est le numéro à définir.

  • Modifications permanentes : vim édite le fichier /etc/security/limits.conf et modifie les hard nofile xxxx et soft nofile xxxx, où xxxx est le numéro à définir. Enregistrez et quittez. Concernant la différence entre dur et mou, veuillez vous référer au 5ème lien de référence ci-dessous.

Recommandations associées : "Tutoriel vidéo Linux"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal