Я пытаюсь получить полную картину с файловыми дескрипторами. Скажем, у меня есть process1, который изначально имеет следующие файловые дескрипторы
_process1_
| |
| 0 stdin |
| 1 stdout |
| 2 stderr |
|__________|
Затем я закрываю файловый дескриптор 1:
close(1);
Файловый дескриптор 1 переводит (указывает) в структуру stdout FILE в таблице открытых файлов ядра .
С кодом выше дескриптор файла 1 удаляется из таблицы процесса, которая становится:
_process1_
| |
| 0 stdin |
| 2 stderr |
|__________|
Но что происходит в ядре? Имеет ли stdout
получить освобождаться структуру FILE? Как это возможно, если стандартный вывод является специальным файлом (монитором) и, вероятно, используется другими процессами? Как насчет структур FILE, которые являются обычными файлами (например, .txt)? Что, если такой файл используется другим процессом?
источник
open
преуспеете.В этом случае не так много будет. stdin, stdout и stderr, как правило, являются клонами одного и того же файлового дескриптора. Счетчик ссылок для дескриптора файла будет уменьшен на единицу. Один и тот же файловый дескриптор обычно содержится в оболочке, из которой была запущена программа, поэтому файловый дескриптор необходимо сохранить.
Ядро ведет подсчет ссылок для всех открытых файлов (inode). Пока счетчик ссылок больше нуля, файл будет сохранен. Я ожидаю, что для дескрипторов открытых файлов хранится отдельный счетчик. Как только это достигнет нуля, ядро может освободить память, используемую дескриптором файла.
Когда все ссылки на файл (записи каталога и дескрипторы файлов) будут удалены, код файловой системы помечает индекс для повторного использования. Любые блоки в файле становятся доступными для размещения. Многие файловые системы очищают указатели блоков в inode после его освобождения. Это затрудняет восстановление удаленного файла. Обновления на диске могут быть буферизованы и завершены позднее.
источник
cat > some.file
, cat получает EOF на stdin, а оболочка - нет. (2) Почему подсчет ссылок? Почему не какая-то форма сборки мусора? Разве GC не намного лучше в пространстве пользователя?cat > some.file
то, что она делает, она разветвляется, открывает файл some.file и присваивает его дескриптору файла 1, затем она делает этоexec("cat")
. Когда процесс exec () 'd, он наследует дескрипторы открытого файла.