Quels sont les descripteurs de fichier, a expliqué en termes simples?
-
Ce qui serait un plus description simplifiée de descripteurs de fichiers par rapport à Wikipédia? Pourquoi sont-ils nécessaires? Dire, prendre des shell processus comme un exemple et comment faut-il faire la demande?
-
Un tableau du processus de contenir plus d'un descripteur de fichier. Si oui, pourquoi?
- Ce qui concerne les notions de stdin stdout stderr, etc ? J'ai une instance comme le disent navigateur processus ouvert et il a permis l'ouverture de certains fichiers temporaires s'affiche sur mon html . Le processus utilise le même fd pour lire / écrire ? Aussi le processus de la table ....... il a des entrées comme fd0 pointeur fd1 pointeur fd2 pointeur ..... est-ce à dire que tous ces fichiers sont dans la mémoire RAM ? Sinon, pourquoi les pointeurs ?
- Lorsque vous ouvrez un fichier, le système d'exploitation crée un flux de données de ce fichier et de le connecter flux de fichier ouvert, le descripteur représente en effet que les flux. De même il y a quelques flux par défaut créé par l'OS. Ces cours d'eau sont connectés à votre terminal au lieu de fichiers. Donc, lorsque vous écrivez quelque chose dans le terminal, il va à flux stdin et les OS. Et quand vous écrivez "ls" de la commande sur le terminal, le système d'exploitation écrit la sortie vers stdout flux. stdout flux de données est connecté à votre moniteur, terminal, de sorte que vous pouvez voir la sortie il.
- Concernant le navigateur exemple, il n'est pas nécessaire que le navigateur conserve les fichiers ouverts. Il dépend de la mise en œuvre de navigateur, mais dans la plupart des cas, le navigateur ouvrir un fichier temporaire, écrire le fichier, puis fermez le fichier, donc il n'est pas nécessaire que le fichier est ouvert, même si la page web est ouverte. Et le descripteur juste détient les informations du fichier et n'est pas nécessairement garder le fichier dans la RAM. Quand vous lisez les données à partir d'un descripteur, le système d'exploitation de lire les données à partir du disque dur. Les informations dans le fichier descripteur de juste représente l'emplacement du fichier sur le disque dur, etc..
- Fichier descripteur de fichier n'est pas une association. Je pourrais ouvrir() le même fichier 4 fois et obtenir 4 types de descripteurs de fichiers. Chacun de ce qui pourrait être utilisée (selon les indicateurs transmis à l'open () pour la lecture, l'écriture ou les deux. Quant à savoir si le fichier de vie dans la mémoire RAM ou sur le disque - ce qui est caché par le noyau, et de ses différents caches. En fin de compte qu'est-ce que le cache va correspondre à ce qui est sur le disque (pour l'écriture), et le noyau ne sera pas revenir en arrière à disque, pour la lecture, si les données sont déjà dans le cache.
- Ma question peut aller trop loin, mais comment OS déterminer les ats pour afficher les sorties lorsque les indices de fd1 et fd2 sont fixes?
- C'est un bon article pour comprendre facilement bottomupcs.com/file_descriptors.xhtml
- Ils passent pour ce qu'ils sont allés dans le processus parent, à moins que quelque chose l'emporte.
- Merci pour le partage de l'article. C'était vraiment bien écrit.
- Voici un bel aperçu de l'histoire: flux Standard à partir de wikipedia. L'article remonte aux années 1950 et discute Unix conception, et explique pourquoi ils ont été normalisés et les valeurs.
- merci pour l'article. C'est une grande question, mais aucune des réponses a donné un exemple concret, comme cet article.
- aussi cette question peut-être être utile
InformationsquelleAutor Nishant | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
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 si il y a 100 fichiers ouverts dans votre système d'exploitation puis il y aura 100 entrées en OS (quelque part dans le noyau). Ces entrées sont représentées par des nombres 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 ouvre 10 fichiers ensuite, votre Processus de table à 10 entrées pour les descripteurs de fichier.
De même, lorsque vous ouvrez un socket réseau, il est également représenté par un entier et il est appelé Descripteur de Socket.
J'espère que vous comprenez.
/proc
tout le temps.p1
etp2
. Par défaut, le système d'exploitation est connecté à sonstdin
,stdout
etstderr
à un clavier, un moniteur et moniteur respectivement. Ces 3 flux standard ont leur FDs 0, 1 et 2 dans deux le processus. Je peux me connecter, direstdin
dep1
à certainsdata.txt
. Par conséquent, les FDs dep1
sont indépendants du fichier FDs dep2
. Je suis mal dans ma logique quelque part ici?open()
vous donnera descripteur de fichier 3, même si un autre processus en cours d'exécution arrive à avoir un descripteur de fichier 3. Voir POSIX définition deopen()
: "La fonction open() doit retourner un descripteur de fichier pour le nom de fichier qui est le plus bas descripteur de fichier actuellement pas ouvrir processus." (emphase ajoutée).lsof -p $SOMEPID
montre quelques entrées communes aveclsof -p $SOMEOPTHERPID
alors à la fois les processus accèdent à la même entrée?variable file = fopen('file-name')
, alors la variablefile
un descripteur de fichier?Un descripteur de fichier est opaque poignée qui est utilisé dans l'interface entre l'utilisateur et l'espace noyau pour identifier le fichier/socket ressources. Par conséquent, lorsque vous utilisez
open()
ousocket()
(appels système d'interface pour le noyau), vous êtes donné un descripteur de fichier, qui est un entier (c'est en fait un index dans le processus en u de la structure - mais ce n'est pas important). Par conséquent, si vous voulez une interface directe avec le noyau, en utilisant le système des appels àread()
,write()
,close()
etc. la poignée que vous utilisez est un descripteur de fichier.Il y a une couche d'abstraction en surimpression sur le système d'appels, ce qui est le
stdio
interface. Cela fournit plus de fonctionnalités et de fonctionnalités que le système de base, les appels. Pour cette interface, l'opacité de la poignée que vous obtenez est unFILE*
, qui est retourné par lafopen()
appel. Il ya beaucoup de fonctions qui utilisent lastdio
interfacefprintf()
,fscanf()
,fclose()
, qui sont là pour rendre votre vie plus facile. En C,stdin
,stdout
, etstderr
sontFILE*
, qui en UNIX respectivement carte de descripteurs de fichiers0
,1
et2
.L'entendre de la Bouche des Chevaux : APUE (Richard Stevens).
Pour le noyau, tous les fichiers ouverts sont visés par des Descripteurs de Fichiers. Un descripteur de fichier est un nombre non négatif.
Lorsque l'on ouvre un fichier existant ou créer un nouveau fichier, le noyau renvoie un descripteur de fichier pour le processus. Le noyau maintient une table de tous les descripteurs de fichiers ouverts, qui sont en cours d'utilisation. L'attribution de descripteurs de fichier est généralement séquentielles et ils sont attribués dans le fichier comme le prochain descripteur de fichier de la piscine de libre descripteurs de fichiers. Quand on ferme le fichier, le fichier descripteur obtient libéré et est disponible pour plus de ventilation.
Voir cette image pour plus de détails :
Lorsque l'on veut lire ou écrire un fichier, nous identifions le fichier descripteur de fichier qui a été renvoyé par open() ou create() appel de fonction, et l'utiliser comme un argument read() ou write().
C'est par convention que, UNIX Système de coquilles associe le descripteur de fichier 0 avec Entrée Standard d'un processus, d'un descripteur de fichier 1 avec Sortie Standard, et le descripteur de fichier 2 avec Erreur Standard.
Descripteur de fichier varie de 0 à OPEN_MAX. Descripteur de fichier max valeur peut être obtenue avec
ulimit -n
. Pour plus d'informations, allez à la 3ème chapitre de APUE Livre.osqueryi <<< echo '.all process_open_files'
dans un shell bash.D'autres réponses ajouté des trucs super. J'ajouterai juste mes 2 cents.
Selon Wikipedia que nous savons pour sûr: un descripteur de fichier est un entier non négatif. La chose la plus importante, je pense, est manquant, serait de dire:
Descripteurs de fichiers sont liés à un ID de processus.
Nous savons que le plus célèbre des descripteurs de fichiers sont 0, 1 et 2.
0 correspond à
STDIN
, 1 àSTDOUT
, et de 2 àSTDERR
.Découvrez ce code
Nous avons créé un processus avec l'id 14726 (PID).
À l'aide de la
lsof -p 14726
nous pouvons obtenir les choses comme ceci:La 4-ème colonne FD et le très à côté de TYPE de colonne correspond au Descripteur de Fichier et le Fichier Descripteur de type.
Certaines des valeurs de la FD peut être:
Mais le descripteur de fichier est sous:
Le caractère après le nombre que j'ai.e "1u", représente le mode dans lequel le fichier est ouvert. r pour la lecture, w pour écrire, u pour les lire et à écrire.
TYPE spécifie le type de fichier. Certaines des valeurs de TYPEs sont:
Mais tous les descripteurs de fichiers sont
CHR – Caractère spécial de fichier (ou le caractère de fichier de périphérique)
Maintenant, nous pouvons identifier les Descripteurs de Fichier pour
STDIN
,STDOUT
etSTDERR
facile aveclsof -p PID
, ou on peut voir les mêmes si l'onls /proc/PID/fd
.Note également que la table de descripteurs de fichier que le noyau garde la trace n'est pas le même que les fichiers de table ou la table des inodes. Ceux-ci sont séparés, comme certains autres réponses expliqué.
Vous demandez peut-être où sont ces descripteurs de fichiers physiquement et ce qui est stocké dans
/dev/pts/6
par exempleBien,
/dev/pts/6
vie purement dans la mémoire. Ce ne sont pas des fichiers ordinaires, mais alors appelé caractère fichiers de périphérique. Vous pouvez le vérifier avec:ls -l /dev/pts/6
et ils vont commencer avecc
, dans mon cascrw--w----
.Juste pour rappel la plupart des Linux comme OS définir sept types de fichiers:
Plus de points concernant
File Descriptor
:File Descriptors
(FD) sont des entiers non négatifs(0, 1, 2, ...)
qui sont associés avec les fichiers qui sont ouverts.0, 1, 2
sont standard FD's qui correspond àSTDIN_FILENO
,STDOUT_FILENO
etSTDERR_FILENO
(défini dansunistd.h
) ouvert par défaut au nom de shell au démarrage du programme.FD sont attribués dans l'ordre séquentiel, sens le plus bas possible non alloué valeur entière.
FD pour un processus particulier peut être vu dans
/proc/$pid/fd
(sur Unix).Comme un complément à d'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 écrire qu'un seul fichier. De même, les dossiers, des entrées-sorties, etc appareils 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ériques] demande un open(), ou un processus ouvre un fichier de l'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, écriture seule, etc. [pour référence : https://en.wikipedia.org/wiki/Everything_is_a_file ]
Descripteurs de fichiers (FD) :
et même les Appareils sont des fichiers. Chaque Fichier est associé à un numéro appelé Descripteur de Fichier (FD).
la sortie est envoyée au Descripteur de Fichier de l'écran, vous verrez
programme de la sortie sur votre moniteur. Si la sortie est envoyée vers un Fichier
Descripteur de l'imprimante, le programme de sortie aurait été
imprimée.
Erreur De Redirection :
Chaque fois que vous exécutez un programme, d'une commande à la borne, 3 fichiers sont toujours ouvertes
Ces fichiers sont toujours présents à chaque fois qu'un programme est exécuté. Comme expliqué avant un descripteur de fichier est associé à chacun des
ces fichiers.
File Descripteur de Fichier
L'Entrée Standard STDIN 0
Sortie Standard STDOUT 1
Erreur Standard STDERR 2
obtient généralement le refus d'une autorisation d'erreurs ou d'autres types d'erreurs. Ces erreurs peuvent être enregistrées dans un fichier particulier.
Exemple 1
Le descripteur de fichier pour l'erreur standard est 2.
Si il n'y a pas de n'importe quel répertoire nommé comme mydir, alors la sortie de la commande sera enregistrer dans un fichier errorfile.txt
À l'aide de "2>" nous rediriger la sortie d'erreur dans un fichier nommé "errorfile.txt"
Ainsi, le programme de sortie n'est pas encombré avec des erreurs.
J'espère que vous avez votre réponse.
Tout système d'exploitation a des processus (p) en cours d'exécution, dire p1, p2, p3 et ainsi de suite. Chaque processus rend généralement une utilisation en cours des fichiers.
Chaque processus est composé d'un processus d'arbre (ou une table de processus, dans un autre phrasé).
Généralement, les systèmes d'Exploitation représentent chaque fichier dans chaque processus par un nombre (c'est-à-dire, dans chaque processus de l'arbre ou de la table).
Le premier fichier utilisé dans le processus est file0, la seconde est fichier1, la troisième est fichier2, et ainsi de suite.
Un tel nombre est un descripteur de fichier.
Descripteurs de fichiers sont généralement des entiers (0, 1, 2 et pas 0.5, 1.5, 2.5).
Étant donné que nous décrivent souvent les processus de "processus-tables", et étant donné que les tables des lignes (les entrées), on peut dire que le descripteur de fichier de cellules dans chaque entrée, utilise pour représenter l'ensemble de l'entrée.
D'une manière similaire, lorsque vous ouvrez un socket réseau, il dispose d'un descripteur de socket.
Dans certains systèmes d'exploitation, vous pouvez les descripteurs de fichiers, mais ce cas est extrêmement rare, et l'utilisateur moyen d'ordinateur ne devriez pas vous inquiéter de cela.
Les descripteurs de fichier peut être global (processus Un commence à dire 0, et se termine à dire dans 1 ; B commence à dire dans 2, et se termine à dire en 3) et ainsi de suite, mais pour autant que je sais, généralement dans les systèmes d'exploitation modernes, les descripteurs de fichier ne sont pas globaux, et sont en fait des processus (processus Un commence à dire 0 et se termine à dire dans 5, tandis que le processus B commence à 0 et se termine à dire dans les 10).
Descripteurs de fichiers
il a été étendu à 63 par de nombreux systèmes.
0: L'entrée standard
1: La sortie standard
2: La sortie d'erreur standard
Plus au-dessus de tous les simplifiée réponses.
Si vous travaillez avec des fichiers de script bash, il est préférable d'utiliser le descripteur de fichier.
Par exemple:-
Vous voulez lire et à écrire à partir de/vers le fichier "test.txt".
Utiliser le descripteur de fichier comme ci-dessous montrent
Descripteurs de fichiers sont les descripteurs de fichier. Ils donnent des liens vers un fichier. Avec l'aide d'entre eux, nous pouvons lire, à écrire et à ouvrir un fichier.