Quelle serait une description plus simplifiée des descripteurs de fichiers par rapport à Wikipédia? Pourquoi sont-ils nécessaires? Prenons l'exemple des processus shell et comment cela s'applique-t-il?
Une table de processus contient-elle plusieurs descripteurs de fichier? Si oui, pourquoi?
unix
operating-system
file-descriptor
Nishant
la source
la source
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. Donc, 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. Il s'agit donc simplement d'un nombre entier qui représente uniquement un fichier ouvert dans le système d'exploitation. Si votre processus ouvre 10 fichiers, votre table Process aura 10 entrées pour les descripteurs de fichiers.
De même, lorsque vous ouvrez un socket réseau, il est également représenté par un entier et il est appelé Socket Descriptor. J'espère que tu comprends.
la source
/proc
permanence.open()
vous donnera le descripteur de fichier 3, même si un autre processus en cours d'exécution a un descripteur de fichier 3. Voir la définition POSIX deopen()
: "La fonction open () retournera un descripteur de fichier pour le fichier nommé qui est le plus bas descripteur de fichier actuellement non ouvert pour ce processus . " (pas d'italique dans l'original).Un descripteur de fichier est un descripteur opaque utilisé dans l'interface entre l'espace utilisateur et le noyau pour identifier les ressources de fichier / socket. Par conséquent, lorsque vous utilisez
open()
ousocket()
(appels système pour interfacer avec le noyau), vous recevez un descripteur de fichier, qui est un entier (il s'agit en fait d'un index dans la structure du processus u - mais ce n'est pas important). Par conséquent, si vous voulez une interface directe avec le noyau appelle, système à l' aide deread()
,write()
,close()
etc. la poignée que vous utilisez est un descripteur de fichier.Il existe une couche d'abstraction superposée sur les appels système, qui est l'
stdio
interface. Cela fournit plus de fonctionnalités / fonctionnalités que les appels système de base. Pour cette interface, le handle opaque que vous obtenez est unFILE*
, qui est renvoyé par l'fopen()
appel. Il y a beaucoup de nombreuses fonctions qui utilisent l'stdio
interface defprintf()
,fscanf()
,fclose()
qui sont là pour vous rendre la vie plus facile. En C,stdin
,stdout
, etstderr
sontFILE*
, dans laquelle la carte UNIX respectivement aux descripteurs de fichiers0
,1
et2
.la source
Écoutez-le de la bouche du cheval: 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 créons un nouveau fichier, le noyau renvoie un descripteur de fichier au processus. Le noyau conserve une table de tous les descripteurs de fichiers ouverts, qui sont en cours d'utilisation. L'attribution des descripteurs de fichiers est généralement séquentielle et ils sont attribués au fichier en tant que prochain descripteur de fichiers gratuit à partir du pool de descripteurs de fichiers gratuits. Lorsque nous fermons le fichier, le descripteur de fichier est libéré et est disponible pour une attribution ultérieure.
Voir cette image pour plus de détails:
Lorsque nous voulons lire ou écrire un fichier, nous identifions le fichier avec le descripteur de fichier qui a été renvoyé par l' appel de fonction open () ou create () , et nous l'utilisons comme argument pour lire () ou écrire () .
C'est par convention que les shells UNIX System associent le descripteur de fichier 0 à l'entrée standard d'un processus, le descripteur de fichier 1 à la sortie standard et le descripteur de fichier 2 à l'erreur standard .
Le descripteur de fichier va de 0 à OPEN_MAX. La valeur maximale du descripteur de fichier peut être obtenue avec
ulimit -n
. Pour plus d'informations, consultez le 3ème chapitre du livre APUE.la source
osqueryi <<< echo '.all process_open_files'
dans un shell bash.D'autres réponses ont ajouté d'excellentes choses. J'ajouterai juste mes 2 cents.
Selon Wikipedia, nous savons avec certitude: un descripteur de fichier est un entier non négatif. Je pense que la chose la plus importante qui manque est de dire:
Les descripteurs de fichiers sont liés à un ID 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
.Découvrez ce code
Nous avons créé un processus avec l'ID 14726 (PID). En utilisant le
lsof -p 14726
nous pouvons obtenir des choses comme ceci:La 4ème colonne FD et la toute prochaine colonne TYPE correspondent au descripteur de fichier et au type de descripteur de fichier.
Certaines des valeurs pour le FD peuvent être:
Mais le vrai descripteur de fichier est sous:
Le caractère après le chiffre, c'est-à-dire "1u", représente le mode dans lequel le fichier est ouvert. r pour lire, w pour écrire, u pour lire et écrire.
TYPE spécifie le type du fichier. Certaines des valeurs des TYPE sont:
Mais tous les descripteurs de fichiers sont CHR - Fichier spécial de caractères (ou fichier de périphérique de caractères)
Maintenant, nous pouvons identifier les descripteurs de fichiers pour
STDIN
,STDOUT
etSTDERR
facile aveclsof -p PID
, ou nous pouvons voir la même chose si nousls /proc/PID/fd
.Notez également que la table de descripteurs de fichiers dont le noyau assure le suivi n'est pas la même que la table de fichiers ou la table d'inodes. Celles-ci sont distinctes, comme l'expliquent certaines autres réponses.
Vous pouvez vous demander où sont physiquement ces descripteurs de fichiers et ce qui est stocké
/dev/pts/6
par exempleEh bien,
/dev/pts/6
vit purement dans la mémoire. Ce ne sont pas des fichiers normaux, mais des fichiers appelés périphériques de caractères . Vous pouvez vérifier cela avec:ls -l /dev/pts/6
et ils commenceront parc
, dans mon cascrw--w----
.Juste pour rappeler la plupart des Linux comme OS, définissez sept types de fichiers:
la source
Plus de points concernant
File Descriptor
:File Descriptors
(FD) sont des entiers non négatifs(0, 1, 2, ...)
associés aux fichiers ouverts.0, 1, 2
sont des FD standard qui correspondent àSTDIN_FILENO
,STDOUT_FILENO
etSTDERR_FILENO
(définis dansunistd.h
) ouverts par défaut au nom du shell au démarrage du programme.Les FD sont alloués dans l'ordre séquentiel, ce qui signifie la valeur entière non allouée la plus basse possible.
Les FD pour un processus particulier peuvent être vus dans
/proc/$pid/fd
(sur les systèmes basés sur Unix).la source
En plus des autres réponses, unix considère tout comme un système de fichiers. Votre clavier est un fichier qui est en lecture seule du point de vue du noyau. L'écran est un fichier en écriture seule. 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 les pilotes de périphérique [pour les fichiers de périphérique] demandent un open (), ou lorsqu'un processus ouvre un fichier utilisateur, le noyau alloue un descripteur de fichier, un entier qui spécifie l'accès à ce fichier tel qu'il soit en lecture seule , écrivez seulement etc. [pour référence: https://en.wikipedia.org/wiki/Everything_is_a_file ]
la source
Descripteurs de fichiers (FD):
Redirection d'erreur:
chaque fois que vous exécutez un programme / commande sur le terminal, 3 fichiers sont toujours ouverts
Ces fichiers sont toujours présents chaque fois qu'un programme est exécuté. Comme expliqué précédemment, un descripteur de fichier est associé à chacun de ces fichiers.
Fichier Descripteur de fichier
Entrée standard STDIN 0
Sortie standard STDOUT 1
Erreur standard STDERR 2
Exemple 1
Le descripteur de fichier pour l'erreur standard est 2.
S'il n'y a aucun répertoire nommé mydir, la sortie de la commande sera enregistré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 vous avez obtenu votre réponse.
la source
Tout système d'exploitation a des processus (p) en cours d'exécution, par exemple p1, p2, p3 et ainsi de suite. Chaque processus utilise généralement des fichiers en continu.
Chaque processus est composé d'une arborescence de processus (ou d'une table de processus, dans un autre phrasé).
Habituellement, les systèmes d'exploitation représentent chaque fichier de chaque processus par un numéro (c'est-à-dire dans chaque arbre / table de processus).
Le premier fichier utilisé dans le processus est file0 , le deuxième est file1 , le troisième est file2 , etc.
Un tel nombre est un descripteur de fichier.
Les descripteurs de fichiers sont généralement des entiers (0, 1, 2 et non 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 un socket réseau, il a un descripteur de socket.
Dans certains systèmes d'exploitation, vous pouvez manquer de descripteurs de fichiers, mais ce cas est extrêmement rare, et l'utilisateur moyen de l'ordinateur ne devrait pas s'en inquiéter.
Les descripteurs de fichiers peuvent être globaux (le processus A commence par exemple 0 et se termine par 1; le processus B commence par 2 et se termine par 3) et ainsi de suite, mais pour autant que je sache, généralement dans les systèmes d'exploitation modernes, fichier les descripteurs ne sont pas globaux et sont en fait spécifiques au processus (le processus A commence par exemple 0 et se termine par 5, tandis que le processus B commence par 0 et se termine par 10).
la source
Descripteurs de fichiers
la source
Ajout à des réponses surtout simplifiées.
Si vous travaillez avec des fichiers dans le script bash, il est préférable d'utiliser un descripteur de fichier.
Par exemple: -
Vous souhaitez lire et écrire depuis / vers le fichier "test.txt".
Utilisez le descripteur de fichier comme indiqué ci-dessous
la source
Les descripteurs de fichiers sont les descripteurs d'un fichier. Ils donnent des liens vers un fichier. Avec leur aide, nous pouvons lire, écrire et ouvrir un fichier.
la source