J'essaie d'obtenir l'image complète avec des descripteurs de fichiers. Disons que j'ai process1 qui a initialement ces descripteurs de fichiers:
_process1_
| |
| 0 stdin |
| 1 stdout |
| 2 stderr |
|__________|
Ensuite, je ferme le descripteur de fichier 1:
close(1);
Le descripteur de fichier 1 se traduit (pointe) par la structure stdout FILE dans la table des fichiers ouverts du noyau .
Avec le code ci-dessus, le descripteur de fichier 1 est supprimé de la table du processus qui devient:
_process1_
| |
| 0 stdin |
| 2 stderr |
|__________|
Mais que se passe-t-il dans le noyau? La stdout
structure FILE est-elle désallouée? Comment est-ce possible si stdout est un fichier spécial (le moniteur) et probablement utilisé par d'autres processus? Qu'en est-il des structures FILE qui ne sont que des fichiers normaux (.txt par exemple)? Que faire si un tel fichier est utilisé par un autre processus?
la source
open
succès.Dans ce cas, il ne se passera pas grand-chose. stdin, stdout et stderr ont tous tendance à être des clones du même descripteur de fichier. Le compteur de référence pour le descripteur de fichier sera décrémenté de un. Le même descripteur de fichier est généralement détenu par le shell à partir duquel le programme a été exécuté, donc le descripteur de fichier doit être conservé.
Le noyau conserve le nombre de références pour tous les fichiers (inodes) ouverts. Tant que le nombre de références est supérieur à zéro, le fichier sera conservé. Je m'attendrais à ce qu'un compteur séparé soit conservé pour les descripteurs de fichiers ouverts. Une fois que cela atteint zéro, le noyau peut libérer la mémoire utilisée par le descripteur de fichier.
Lorsque toutes les références au fichier (entrées de répertoire et descripteurs de fichiers) ont été supprimées, le code du système de fichiers marque l'inode pour la réutilisation. Tous les blocs du fichier sont disponibles pour l'allocation. De nombreux systèmes de fichiers effaceront les pointeurs de bloc dans l'inode lorsqu'il sera libéré. Cela rend difficile la récupération d'un fichier supprimé. Les mises à jour sur le disque peuvent être mises en mémoire tampon et terminées ultérieurement.
la source
cat > some.file
, cat obtient un EOF sur stdin, mais pas le shell. (2) Pourquoi compter les références? Pourquoi pas une forme de ramassage des ordures? Le GC n'est-il pas bien meilleur dans l'espace utilisateur?cat > some.file
ce qu'il fait, il ouvre, 'some.file' et l'affecte au descripteur de fichier 1, alors il le faitexec("cat")
. Lorsqu'un processus est exec () 'd, il hérite des descripteurs de fichiers ouverts.