Что происходит, когда я закрываю () дескриптор файла?

$ l --help
l: command not found

Похож на Вас, настраивали псевдоним в Вашей среде. Возможно, Вы наследовали a .profile, .bashrc или подобный содержащий что-то как alias l='ls -F'.

-F, --classify
              append indicator (one of */=>@|) to entries

Попробовать which l и alias разыскать его определение.

16
28.07.2014, 12:06
2 ответа

Дескриптор файла 1 переводит в stdout Файловую структуру в Ядре, Открывают Files Table.

Это - недоразумение. Таблица файлов ядра не имеет ничего вообще, чтобы сделать с файловыми структурами пространства пользователя.

В любом случае ядро имеет два уровня абстракции. Существует внутренняя структура, которая представляет сам файл, который является считаемой ссылкой. Существует "открытое описание файла", которое является считаемой ссылкой. И затем существует дескриптор файла, который не является считаемой ссылкой. Файловая структура указывает путь к самому inode. Открытое описание файла содержит вещи как открытый режим и указатель файла.

Когда Вы звоните близко, Вы всегда закрываете дескриптор файла. Когда дескриптор файла закрывается, подсчет ссылок на его открытом описании файла постепенно уменьшается. Если это переходит к нулю, открытое описание файла также выпущено, и подсчет ссылок на самом файле постепенно уменьшается. Только если это переходит к нулю, освобожденная файловая структура ядра.

Нет никакого шанса для одного процесса для выпуска ресурса, который использует другой процесс, потому что совместно используемые ресурсы являются считаемой ссылкой.

13
27.01.2020, 19:48
  • 1
    я испытываю небольшие трудности с пониманием терминологии в Вашем ответе. Я предполагаю, что указатель файла означает "файловое смещение". Это то, что Вы имели в виду? Также, что Вы подразумевали под дескриптором файла? –  Geek 28.07.2014, 22:12
  • 2
    Это корректно "файловым смещением", я имею в виду смещение, при котором произошли бы последующее чтение или запись. "Дескриптор файла" является ссылкой между процессом и открытым описанием файла - это - то, что Вы возвращаете когда open успешно выполняется. –  David Schwartz 29.07.2014, 01:47

В этом случае не много произойдет. stdin, stdout, и stderr все склонны быть клонами того же дескриптора файла. Ссылочный счетчик для дескриптора файла будет постепенно уменьшен одним. Тот же дескриптор файла обычно сохранен оболочкой, от которой была запущена программа, таким образом, дескриптор файла должен быть сохранен.

Ядро проводит подсчет ссылок для всех файлов (inodes), которые открыты. Пока подсчет ссылок больше, чем нуль, которым будет сохранен файл. Я ожидал бы, что отдельный счетчик сохранен для открытых дескрипторов файлов. После того как это поражает нуль, ядро может освободить память, используемую дескриптором файла.

Когда все ссылки на файл (записи каталога и дескрипторы файлов) будут удалены, код файловой системы отметит inode для повторного использования. Любые блоки, которые имеет файл, сделаны доступными для выделения. Много файловых систем очистят указатели блока в inode, когда он будет выпущен. Это делает восстановление удаленного файла трудным. Обновления диска могут быть буферизованы и завершены в более позднее время.

6
27.01.2020, 19:48
  • 1
    Два вопроса: (1) дескрипторы файлов действительно касательно - считаемый? Когда Вы управляете-d a cat > some.file, кошка получает EOF на stdin, но оболочка не делает. (2) Почему подсчет ссылок? Почему не некоторая форма сборки "мусора"? Разве GC не находится намного лучше в пространстве пользователя? –  Bruce Ediger 28.11.2011, 06:54
  • 2
    Подробно останавливаясь на ответе BillThor: В нормальных случаях stdin, stdout, и stderr являются просто открытыми дескрипторами файлов к устройству TTY. Таким образом, если Вы закрываете дескриптор файла, что устройство TTY все еще там и может даже быть вновь открыто снова в более позднее время. –  Patrick 28.11.2011, 07:03
  • 3
    @BruceEdiger: (1) когда оболочка работает cat > some.file что его на самом деле выполнение разветвляет, открываясь 'some.file' и присваивая его дескриптору файла 1, затем это делает exec("cat"). Когда процесс является должностным лицом () 'd, он наследовал открытые дескрипторы файлов. –  Patrick 28.11.2011, 07:06
  • 4
    @BruceEdiger (2) Подсчет ссылок является превосходной формой сборки "мусора", когда это используется на структурах данных, которые не содержат указатели на (или цепочки указателей, заканчивающихся в) другие структуры данных того же типа. Кроме того, это происходит в пространстве ядра (не, что оно имеет значение очень). –  Gilles 'SO- stop being evil' 28.11.2011, 19:29

Теги

Похожие вопросы