Que sont les descripteurs de fichiers, expliqués en termes simples?

  1. 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?

  2. est-ce qu'une table de processus contient plus d'un descripteur de fichier. Si oui, pourquoi?

270
demandé sur Bhesh Gurung 2011-03-10 10:17:21

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.

423
répondu Tayyab 2015-02-19 22:55:01

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 .

85
répondu Beano 2015-10-22 05:29:42

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 :

Two Process

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.

78
répondu Shekhar Kumar 2016-01-07 21:25:41

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 ]

13
répondu Balu 2016-10-24 03:58:37

plus de points concernant File Descriptor :

  1. File Descriptors (FD) sont des entiers non-négatifs (0, 1, 2, ...) qui sont associés avec des fichiers qui sont ouverts.

  2. 0, 1, 2 sont la norme FD 's qui correspond à STDIN_FILENO , STDOUT_FILENO et STDERR_FILENO (défini dans unistd.h ) ouvert par défaut au nom de shell lorsque le programme démarre.

  3. FD sont attribués dans l'ordre séquentiel, sens le plus bas possible non alloué valeur de type entier.

  4. FD pour un processus particulier peut être vu dans /proc/$pid/fd (sur Unix).

11
répondu Sandeep_black 2018-07-06 19:09:04

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).

3
répondu JohnDoea 2016-12-21 04:17:39

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.

fd table

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
3
répondu prosti 2018-09-29 11:38:16

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
    1. entrée standard
    2. sortie standard
    3. 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.



2
répondu Abhishek Kamal 2018-09-02 17:48:54

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
1
répondu Mahendra suthar 2018-10-03 13:08:51

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.

-5
répondu Motimahal 2018-08-18 03:43:05