Дескрипторы
В Linux дескриптор - это целочисленное значение, которое используется для доступа к файлам, сокетам, каналам, устройствам и другим объектам ввода-вывода. Дескрипторы представляют собой абстракцию для этих объектов, позволяя процессам взаимодействовать с ними через стандартизированный интерфейс операционной системы.
Процесс может открыть файл или создать сокет, канал или устройство, что приведет к созданию соответствующего дескриптора. Затем он может использовать этот дескриптор для чтения, записи или управления объектом, с которым он связан. Дескрипторы также используются операционной системой для управления ресурсами и организации ввода-вывода в процессах.
Процесс создания дескриптора в Linux включает в себя следующие шаги:
- Открытие файла или создание ресурса: Процесс, который хочет взаимодействовать с файлом, вызывает системный вызов
open()(или его аналоги, такие какsocket()для сокетов илиpipe()для каналов) с именем файла или параметрами, определяющими необходимый ресурс. - Выделение дескриптора: При успешном открытии файла или создании ресурса операционная система выделяет новый дескриптор и возвращает его вызывающему процессу. Этот дескриптор является уникальным для данного процесса и обычно является наименьшим доступным неотрицательным целым числом, которое ещё не было использовано для другого открытого файла или ресурса.
- Использование дескриптора: После того как дескриптор был получен, процесс может использовать его для выполнения операций ввода-вывода с соответствующим файлом или ресурсом. Это может включать операции чтения, записи, закрытия файла и т. д.
- Освобождение дескриптора: После завершения работы с файлом или ресурсом процесс должен закрыть дескриптор, вызвав системный вызов
close(). Это освободит занятый дескриптор и позволит операционной системе использовать его для других целей.
В Linux есть несколько типов дескрипторов:
Файловые дескрипторы (File Descriptors)
Эти дескрипторы используются для доступа к файлам, каталогам и другим файловым объектам в файловой системе. Стандартные файловые дескрипторы, предоставляемые операционной системой, включают stdin (0), stdout (1) и stderr (2), которые используются для стандартного ввода, вывода и вывода ошибок соответственно.
Подробно про стандартные файловые дескрипторы
nr_open
nr_open - параметр который управляет максимальным количеством файловых дескрипторов, которые может открыть процесс. Каждый открытый файл, сокет или другой объект ввода-вывода в Linux связан с файловым дескриптором. Увеличение значения nr_open позволяет процессам открывать больше файлов, что может быть полезно для высоконагруженных серверов или приложений.
sysctl fs.nr_open
# Общесистемное ограничение на максимальное количество открываемых файловых дескрипторов для всех процессов.
# По умолчанию, верхний придел 1048576 (1024*1024).
Следует иметь ввиду, что существуют еще "жесткие ограничения" и "мягкие ограничения", которые задаются для каждого отдельного процесса, значения этих ограничений можно посмотреть с помощью команд:
ulimit -n(показывает текущие ограничения),ulimit -Sn(показывает мягкие ограничения),ulimit -Hn(показывает жесткие ограничения)
По умолчанию, максимальное доступное число открытых дескрипторов для процесса - 1024.
Мягкое значение устанавливается после входа пользователя в систему, но процессу пользователей разрешено увеличивать ограничение до жесткого ограничения. Изменить заданные по умолчанию ограничения можно в этом файле /etc/security/limits.conf, указав требуемое значение nofile.
Дескрипторы сокетов (Socket Descriptors)
Эти дескрипторы используются для работы с сокетами, которые представляют сетевые соединения между процессами. Сокеты могут быть как доменными (для локального взаимодействия), так и сетевыми (для взаимодействия через сеть).
Сокеты обеспечивают двухстороннюю связь типа точка-точка между двумя процессами. Они являются основными компонентами межсистемной и межпроцессной связи. Каждый сокет представляет собой конечную точку связи, с которой может быть совмещено некоторое имя. Он имеет определенный тип, и один процесс или несколько, связанных с ним процессов.
Сокеты находятся в областях связи (доменах). Домен сокета - это абстракция, которая определяет структуру адресации и набор протоколов. Сокеты могут соединяться только с сокетами в том же домене. Всего выделено 23 класса сокетов, из которых обычно используются только UNIX-сокеты и Интернет-сокеты. Сокеты могут использоваться для установки связи между процессами на отдельной системе подобно другим формам IPC.
Класс сокетов UNIX обеспечивает их адресное пространство для отдельной вычислительной системы. Сокеты области UNIX называются именами файлов UNIX. Сокеты также можно использовать, чтобы организовать связь между процессами на различных системах. Адресное пространство сокетов между связанными системами называют доменом Интернета. Коммуникации домена Интернета используют стек протоколов TCP/IP.
Сокет (socket) - это конечная точка сетевых коммуникаций. Он является чем-то вроде "портала", через которое можно отправлять байты во внешний мир. Приложение просто пишет данные в сокет; их дальнейшая буферизация, отправка и транспортировка осуществляется используемым стеком протоколов и сетевой аппаратурой. Чтение данных из сокета происходит аналогичным образом.
В программе сокет идентифицируется дескриптором - это просто переменная типа int. Программа получает дескриптор от операционной системы при создании сокета, а затем передаёт его сервисам socket API для указания сокета, над которым необходимо выполнить то или иное действие.
Дескрипторы каналов (Pipe Descriptors)
Эти дескрипторы используются для работы с каналами (pipe), которые представляют собой механизм для однонаправленной передачи данных между процессами.
Дескрипторы каналов (Pipe Descriptors) - это целочисленные значения, которые используются для взаимодействия между процессами через каналы (pipes).
Когда вы создаете канал в UNIX-подобной системе с помощью системного вызова pipe(), операционная система создает новый канал и возвращает два файловых дескриптора:
- Дескриптор для чтения (Read Descriptor): Этот дескриптор используется для чтения данных из канала. Это обычно файловый дескриптор с индексом 0.
- Дескриптор для записи (Write Descriptor): Этот дескриптор используется для записи данных в канал. Это обычно файловый дескриптор с индексом 1.
После создания канала процессы могут использовать эти дескрипторы для передачи данных друг другу. Например, процесс-родитель может записывать данные в канал с помощью дескриптора для записи, а процесс-потомок может читать эти данные из канала с помощью дескриптора для чтения.
Дескриптор inode (inode descriptor)
Дескриптор inode - это структура данных в файловых системах UNIX, которая содержит метаданные о файле или каталоге. Иноды представляют собой уникальные идентификаторы файловых объектов и содержат информацию о их атрибутах, таких как права доступа, время создания, время последнего доступа и изменения, количество ссылок на файл, а также указатели на данные файла или каталога.
Дескриптор inode - это целочисленное значение, которое является ссылкой на инод в файловой системе. Когда вы открываете файл в UNIX-подобной системе, операционная система создает дескриптор файла, который ассоциируется с соответствующим инодом. Этот дескриптор inode используется для выполнения операций ввода-вывода с файлом, таких как чтение, запись, перемещение и удаление.
Дескриптор inode обеспечивает уникальную идентификацию файла в рамках файловой системы, даже если файл переименован или перемещен в другой каталог. Он также обеспечивает механизм подсчета ссылок на файлы и управления файловыми атрибутами.
В целом, дескриптор inode - это способ ссылки на файл или каталог в файловой системе, который используется операционной системой для выполнения операций ввода-вывода и управления файлами.
Дескрипторы устройств (Device Descriptors)
Эти дескрипторы используются для работы с устройствами, такими как жесткие диски, сетевые интерфейсы, устройства ввода-вывода и т. д.