Que sont les descripteurs de fichiers, expliqués en termes simples?
-
Qu'est-ce qui serait une description plus simplifiée des descripteurs de fichier par rapport à celle de Wikipedia? Pourquoi sont-ils nécessaires? Dire, prendre des shell processus comme un exemple et comment l'appliquer?
-
est-ce qu'une table de processus contient plus d'un descripteur de fichier. Si oui, pourquoi?
10 réponses
En termes simples, lorsque vous ouvrez un fichier, le système d'exploitation crée une entrée pour représenter ce fichier et stocker les informations sur ce fichier ouvert. Ainsi, s'il y a 100 fichiers ouverts dans votre système D'exploitation, il y aura 100 entrées dans le système d'exploitation (quelque part dans le noyau). Ces entrées sont représentées par des entiers comme (...100, 101, 102....). Ce numéro d'entrée est le descripteur de fichier. C'est juste un nombre entier unique qui représente un fichier ouvert dans le système d'exploitation. Si votre processus s'ouvre 10 dossiers puis votre table de processus aura 10 entrées pour les descripteurs de dossier.
de même, lorsque vous ouvrez une socket réseau, elle est également représentée par un entier et elle est appelée descripteur de Socket. J'espère que vous comprenez.
un descripteur de fichier est une poignée opaque qui est utilisée dans l'interface entre l'espace utilisateur et le noyau pour identifier les ressources de fichier/socket. Par conséquent, lorsque vous utilisez open()
ou socket()
(appels système à l'interface avec le noyau), vous recevez un descripteur de fichier, qui est un entier (c'est en fait un index dans la structure des processus u - mais ce n'est pas important). Par conséquent, si vous voulez interfacer directement avec le noyau, en utilisant les appels système vers read()
, write()
, close()
etc. la poignée que vous utilisez est un descripteur de fichier.
il y a une couche d'abstraction superposée sur les appels système, qui est l'interface stdio
. Cela offre plus de fonctionnalités que les appels système de base. Pour cette interface , le manche opaque que vous obtenez est un FILE*
, qui est retourné par l'appel fopen()
. Il existe de nombreuses fonctions qui utilisent l'interface stdio
fprintf()
, fscanf()
, fclose()
, qui sont pour rendre votre vie plus facile. Dans C, stdin
, stdout
, et stderr
sont FILE*
, qui dans UNIX respectivement map vers les descripteurs de fichiers 0
, 1
et 2
.
l'Entendre de la Bouche des Chevaux : APUE (Richard Stevens).
Pour le noyau, tous les fichiers ouverts sont référencés par des descripteurs de fichiers. Un descripteur de fichier est un nombre non négatif.
lorsque nous ouvrons un fichier existant ou que nous créons un nouveau fichier, le noyau renvoie un descripteur de fichier au processus. le noyau maintient une table de tous les descripteurs de fichiers ouverts, qui sont utilisés. L'attribution de fichier les descripteurs sont généralement séquentiels et ils sont allotisés au fichier en tant que descripteur de fichier Libre suivant de la liste des descripteurs de fichier Libre. Lorsque nous fermons le fichier, le descripteur de fichier est libéré et disponible pour affectation ultérieure.
Voir cette image pour plus de détails :
Lorsque l'on veut lire ou écrire un fichier, nous identifions le fichier avec le descripteur de fichier a été renvoyé par le open() ou create() appel de fonction, et l'utiliser comme un argument read() ou write() .
C'est par convention que, UNIX System shells associe le descripteur de fichier 0 avec entrée Standard d'un processus, le descripteur de fichier 1 avec sortie Standard , et le descripteur de fichier 2 avec erreur Standard .
Le descripteur de fichier varie de 0 à OPEN_MAX.
Pour plus d'informations, consultez le chapitre 3 du livre D'APUE.
en plus des autres réponses, unix considère tout comme un système de fichiers. Votre clavier est un fichier qui est lu seulement du point de vue du noyau. L'écran est un fichier en écriture seulement. De même, les dossiers, les périphériques d'entrée-sortie, etc. sont également considérés comme des fichiers. Chaque fois qu'un fichier est ouvert, par exemple lorsque le périphérique pilote [pour les fichiers périphériques] demande une ouverture (), ou lorsqu'un processus ouvre un fichier utilisateur, le noyau attribue un descripteur de fichier, un entier qui spécifie l'accès à ce fichier. tel il étant lu seulement, écrit seulement etc. [pour référence: https://en.wikipedia.org/wiki/Everything_is_a_file ]
plus de points concernant File Descriptor
:
-
File Descriptors
(FD) sont des entiers non-négatifs(0, 1, 2, ...)
qui sont associés avec des fichiers qui sont ouverts. -
0, 1, 2
sont la norme FD 's qui correspond àSTDIN_FILENO
,STDOUT_FILENO
etSTDERR_FILENO
(défini dansunistd.h
) ouvert par défaut au nom de shell lorsque le programme démarre. -
FD sont attribués dans l'ordre séquentiel, sens le plus bas possible non alloué valeur de type entier.
-
FD pour un processus particulier peut être vu dans
/proc/$pid/fd
(sur Unix).
tout système d'exploitation a des processus (p) en cours, dites p1, p2, P3 et ainsi de suite. Chaque processus fait habituellement une utilisation continue des fichiers.
Chaque processus est composé d'un processus d'arbre (ou une table de processus, dans un autre phrasé).
habituellement, les systèmes D'exploitation représentent chaque fichier dans chaque processus par un numéro (c'est-à-dire dans chaque arbre/table de processus).
Le premier fichier utilisé dans le processus est file0 , la seconde est fichier1 , le troisième est fichier2 , et ainsi de suite.
un tel numéro est un descripteur de fichier.
les descripteurs de fichier sont généralement des entiers (0, 1, 2 et pas 0.5, 1.5, 2.5).
étant donné que nous décrivons souvent les processus comme des" tables de processus", et étant donné que les tables ont des lignes (entrées) nous pouvons dire que la cellule de descripteur de fichier dans chaque entrée, utilise pour représenter l'entrée entière.
de la même manière, lorsque vous ouvrez une socket réseau, elle a un descripteur de socket.
dans certains systèmes d'exploitation, vous pouvez manquer de descripteurs de fichier, mais un tel cas est extrêmement rare, et l'utilisateur moyen d'ordinateur ne devrait pas s'inquiéter de cela.
les descripteurs de fichier peuvent être globaux (le processus a commence par 0, et se termine par 1 ; le processus B commence par dire en 2, et finit par dire en 3) et ainsi de suite, mais pour autant que je sache, généralement dans les systèmes d'exploitation modernes, les descripteurs de fichiers ne sont pas globaux, et sont en fait spécifiques au processus (le processus a commence par dire 0 et finit par dire en 5, tandis que le processus B commence par 0 et finit par dire en 10).
D'autres réponses ont ajouté de grandes choses. Je n'ajouterai que mes deux cents.
selon Wikipedia nous savons à coup sûr: un descripteur de fichier est un entier non-négatif. La chose la plus importante que je pense manquer, serait de dire:
les descripteurs de fichier sont liés à un numéro d'identification de processus.
nous savons que les descripteurs de fichiers les plus connus sont 0, 1 et 2.
0 correspond à STDIN
, 1 à STDOUT
, et 2 à STDERR
.
dites, prenez les processus shell comme exemple et comment cela s'applique-t-il?
Regardez ce code
#>sleep 1000 &
[12] 14726
nous avons créé un processus avec le id 14726 (PID).
En utilisant le lsof -p 14726
nous pouvons obtenir les choses comme ceci:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
la 4-ème colonne FD et le type de colonne suivant correspondent au descripteur de fichier et au type de descripteur de fichier.
certaines des valeurs pour la FD peuvent être:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Mais le descripteur de fichier est sous la rubrique:
NUMBER – Represent the actual file descriptor.
le caractère après le numéro I. e "1u", représente le mode d'ouverture du fichier. r pour lire, w pour écrire, u pour lire et écrire.
TYPE spécifie le type du fichier. Certaines des valeurs des TYPEs sont:
REG – Regular File
DIR – Directory
FIFO – First In First Out
mais tous les descripteurs de fichier être CHR – Caractère spécial de fichier (ou le caractère périphérique de fichier)
maintenant, nous pouvons identifier les descripteurs de fichier pour STDIN
, STDOUT
et STDERR
facile avec lsof -p PID
, ou nous pouvons voir la même chose si nous ls /proc/PID/fd
.
Notez aussi que la table descripteur de fichier que le noyau garde trace n'est pas la même que la table files table ou la table inodes table. Il s'agit de questions distinctes, comme l'ont expliqué d'autres réponses.
vous pouvez vous demander Où sont physiquement ces descripteurs de fichier et ce qui est stocké dans /dev/pts/6
par exemple
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
eh Bien, /dev/pts/6
la vie est purement dans la mémoire. Ce ne sont pas des fichiers réguliers, mais ce qu'on appelle les fichiers de périphériques de caractères . Vous pouvez vérifier cela avec: ls -l /dev/pts/6
et ils vont commencer par c
, dans mon cas crw--w----
.
juste pour rappeler la plupart de Linux comme OS définir sept types de fichiers:
- fichiers Réguliers
- annuaires
- Caractère fichiers de périphériques
- Bloquer les fichiers de périphériques
- Local sockets de domaine
- Named pipes (FIFOs) et
- liens symboliques
descripteurs de fichier (FD) :
- dans Linux/Unix , tout est un fichier. Fichier régulier, répertoires, et même les Appareils sont des fichiers. Chaque fichier a un numéro associé appelé descripteur de fichier (FD).
- votre écran a aussi un descripteur de fichier. Lorsqu'un programme est exécuté
la sortie est envoyée au Descripteur de Fichier de l'écran, vous verrez
sortie du programme sur votre surveiller. Si la sortie est envoyée au fichier
Descripteur de l'imprimante, la sortie du programme aurait été
imprimer.
Redirection D'Erreur :
Chaque fois que vous exécutez un programme/commande au terminal, 3 fichiers sont toujours ouverts- entrée standard
- sortie standard
- erreur type.
Ces fichiers sont toujours présents lors de l'exécution d'un programme. Comme expliqué avant un descripteur de fichier est associé à chacun des ces fichiers.
Fichier Descripteur De Fichier
Entrée Standard STDIN 0
Sortie Standard STDOUT 1
Erreur type STDERR 2
- par exemple, lors de la recherche de fichiers, un
obtient généralement la permission refusé erreurs ou un autre type d'erreurs. Ces erreurs peuvent être enregistrées dans un fichier particulier.
exemple 1
$ ls mydir 2>errorsfile.txt
le descripteur de fichier pour l'erreur standard est 2.
Si il y n'est pas un répertoire nommé mydir alors la sortie de la commande sera sauvegardée dans le fichier errorfile.txt
En utilisant " 2> "nous redirigeons la sortie d'erreur vers un fichier nommé" errorfile.txt "
Ainsi, la sortie du programme n'est pas encombrée d'erreurs.
j'espère que tu as eu ta réponse.
descripteurs de fichier
- À Noyau de tous les fichiers ouverts sont visés par des descripteurs de fichiers.
- Un descripteur de fichier est un entier non négatif.
- lorsque nous ouvrons un fichier existant ou que nous en créons un nouveau, le noyau renvoie un descripteur de fichier à un processus.
- quand nous voulons lire ou écrire sur un fichier, nous identifions le fichier avec le descripteur de fichier qui a été relancé par ouvrir ou créer, comme un argument pour lire ou écrire.
- chaque processus UNIX dispose de 20 descripteurs de fichiers et de l'élimination informatique, numérotés de 0 à 19 mais il a été étendu à 63 par de nombreux systèmes.
- Les trois premiers sont déjà ouvert lorsque le processus commence 0: l'entrée standard 1: la sortie standard 2: la sortie standard error
- lorsque le processus parent bifurque un processus, le processus enfant hérite de la descripteurs de fichier du parent
les descripteurs de fichier sont les descripteurs d'un fichier. Ils donnent des liens vers un fichier. Avec leur aide, nous pouvons lire, écrire et ouvrir un fichier.