Введение в файловый дескриптор fd (файловый дескриптор)

Linux

Когда я раньше читал некоторые статьи по сетевому программированию Linux, я всегда сталкивался с файловым дескриптором fd и не совсем понимал его. Прочитав статью ниже, неплохая, давайте запишем.

Оригинальная ссылка

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

Во-первых, концепция файловых дескрипторов.

В системе Linux все рассматривается как файл. Когда процесс открывает существующий файл или создает новый файл, ядро ​​возвращает процессу дескриптор файла. Дескриптор файла — это индекс, созданный ядром для эффективного управления открытыми файлами. files. , используемый для указания на открытый файл, и все системные вызовы, выполняющие операции ввода-вывода, проходят через файловый дескриптор.

Во-вторых, взаимосвязь между файловыми дескрипторами, файлами и процессами.

1. Описание:

Каждый файловый дескриптор соответствует открытому файлу.

Различные файловые дескрипторы также могут указывать на один и тот же файл.

Один и тот же файл может открываться разными процессами или несколько раз в одном процессе.

2. Система создает три таблицы для поддержки файловых дескрипторов.

Таблица файловых дескрипторов уровня процесса

таблица файловых дескрипторов системного уровня

Таблица i-узлов файловой системы (Перейти к: Ruan Yifeng - понимание инодов)

PS: суммируйте мягкие и жесткие ссылки.
При жестком связывании новый файл имеет тот же номер iNode, что и исходный файл. Количество ссылок в iNode исходного файла будет увеличено на единицу. Удалите исходный файл, новый файл не затрагивается. Для мягкого подключения номера iNode нового файла и исходного файла отличаются. Количество ссылок iNode в исходном файле остается неизменным. Удалите исходный файл, и доступ к новому файлу сообщит, что файл не существует.

3. Через эти три таблицы узнайте дескриптор файла

В процессе A файловые дескрипторы 1 и 30 указывают на один и тот же дескриптор открытого файла (#23), который может выполняться процессом несколько раз.

Файловый дескриптор 2 в процессе A и файловый дескриптор 2 в процессе B указывают на один и тот же дескриптор открытого файла (#73).В этой ситуации может быть несколько вариантов: 1. Процесс A и процесс B могут находиться в отношениях родитель-потомок. 2. Процесс A и процесс B открывают один и тот же файл, и дескриптор файла один и тот же (событие с низкой вероятностью =_=); 3. Процесс в A и B отправляет дескриптор открытого файла через сокет домена UNIX, переданный другому процесс.

Дескриптор 0 процесса A и дескриптор 3 процесса B соответственно указывают на разные дескрипторы открытых файлов, но оба эти дескриптора указывают на одну и ту же запись в таблице i-узлов (#1936), другими словами, на один и тот же файл. Это происходит потому, что каждый процесс инициирует запрос на открытие одного и того же файла. Аналогичная ситуация возникает, когда один и тот же процесс дважды открывает один и тот же файл.

Мышление предшественников, наша лестница, эта часть относится к Интернету: ссылка

3. Ограничения файлового дескриптора

  Где есть ресурсы, там и война, и "файловые дескрипторы" тоже своего рода ресурсы.Каждый процесс в системе должен иметь "файловые дескрипторы", чтобы выполнять грандиозное дело по изменению мира. Миру нужен порядок, поэтому существует правило «предела файлового дескриптора».

Следующая таблица:

Существует три типа настроек при постоянном изменении ограничений на уровне пользователя:

soft относится к значению настройки, которое действует в текущей системе.

hard относится к максимальному значению, которое может быть установлено в системе

  • Относится как к мягким, так и к жестким значениям.

Объяснение команды:

ulimit
sysctl

В-четвертых, проверьте содержимое процесса, связанное с файловым дескриптором. Шаги (в качестве примера возьмем nginx, *обратите внимание на проблемы с разрешениями, этот пример находится в локальной среде):

Найдите идентификатор процесса, который необходимо проверить

Как показано на рисунке, найденный идентификатор процесса равен 1367.

Посмотреть ограничение для этого процесса

Как показано на рисунке, в строке Max open files видно, что максимальное количество файловых дескрипторов в текущей настройке равно 1024.

Процесс занимает, чтобы увидеть, сколько файловых дескрипторов

Как показано, было использовано 17 файловых дескрипторов.

Суммировать

В реальном процессе приложения, если есть «Слишком много открытых файлов», это можно решить, увеличив количество файловых дескрипторов, доступных для процесса, но часто история так не заканчивается. Во многих случаях это не потому, что слишком мало файловых дескрипторов, доступных процессу. , но из-за программной ошибки открывается большое количество файловых соединений (веб-соединения также занимают файловые дескрипторы) и не освобождаются. Фундаментальное решение проблемы «Слишком много открытых файлов» заключается в своевременном освобождении ресурсов, запрошенных программой, после их использования.