Что будет более упрощенным описанием файловых дескрипторов по сравнению с Википедии? Зачем они нужны? Скажем, возьмите в качестве примера процессы оболочки и как это применимо к нему?
В таблице процессов содержится более одного дескриптора файла. Если да, то почему?
Простыми словами при открытии файла операционная система создает запись для представления этого файла и сохраняет информацию об этом открывшемся файле. Итак, если в вашей ОС открыто 100 файлов, то в ОС будет находиться 100 записей (где-то в ядре). Эти записи представлены целыми числами типа (... 100, 101, 102....). Этот номер записи является файловым дескриптором. Таким образом, это просто целое число, которое уникально представляет собой открытый файл в операционной системе. Если ваш процесс откроет 10 файлов, ваша таблица процессов будет содержать 10 записей для дескрипторов файлов.
Аналогично, когда вы открываете сетевой сокет, он также представляется целым числом и называется дескриптором Socket. Надеюсь, вы понимаете.
/proc
.
Дескриптор файла - это непрозрачный дескриптор, который используется в интерфейсе между пространством пользователя и ядра для идентификации ресурсов файла/сокета. Поэтому, когда вы используете open()
или socket()
(системные вызовы для интерфейса с ядром), вам предоставляется дескриптор файла, который является целым числом (это фактически индекс в структуре процессов u, но это не важно). Поэтому, если вы хотите напрямую взаимодействовать с ядром, используя системные вызовы read()
, write()
, close()
и т.д. Дескриптор, который вы используете, является файловым дескриптором.
На системных вызовах имеется слой абстракции, который является интерфейсом stdio
. Это обеспечивает больше функциональности/функций, чем это делают основные системные вызовы. Для этого интерфейса непрозрачным дескриптором вы получаете FILE*
, который возвращается вызовом fopen()
. Существует много функций, которые используют интерфейс stdio
fprintf()
, fscanf()
, fclose()
, которые помогут вам сделать вашу жизнь проще. В C, stdin
, stdout
и stderr
находятся FILE*
, которые в UNIX соответственно сопоставляются файловым дескрипторам 0
, 1
и 2
.
Услышьте его от Лошадиного устья: APUE (Ричард Стивенс).
К ядру все открытые файлы упоминаются файловыми дескрипторами. Дескриптор файла является неотрицательным числом.
Когда мы открываем существующий файл или создаем новый файл, ядро возвращает дескриптор файла в процесс. Ядро поддерживает таблицу всех открытых дескрипторов файлов, которые используются. Выделение файловых дескрипторов, как правило, является последовательным, и они привязаны к файлу как следующий свободный дескриптор файла из пула свободных файловых дескрипторов. Когда мы закрываем файл, дескриптор файла освобождается и доступен для дальнейшего выделения.
См. Это изображение для получения дополнительной информации:
Когда мы хотим прочитать или записать файл, мы идентифицируем файл с файловым дескриптором, который был вызван вызовом функции open() или create(), и используйте его как аргумент для read() или write().
По общему мнению, оболочки UNIX связывают файловый дескриптор 0 с стандартным входом процесса, дескриптор файла 1 с стандартным выходом и дескриптор файла 2 с Стандартная ошибка.
Дескриптор файла варьируется от 0 до OPEN_MAX.
Для получения дополнительной информации перейдите к третьей главе книги APUE.
osqueryi <<< echo '.all process_open_files'
в оболочке bash.
В дополнение к другим ответам, unix рассматривает все как файловую систему. Ваша клавиатура - это файл, который читается только с точки зрения ядра. Экран - это файл только для записи. Аналогичным образом, папки, устройства ввода-вывода и т.д. Также считаются файлами. Всякий раз, когда файл открывается, скажите, когда драйверы устройства [для файлов устройства] запрашивают open() или процесс открывает файл пользователя, ядро выделяет файловый дескриптор, целое число, которое указывает доступ к этому файлу, такое, что оно доступно только для чтения, писать только и т.д. [для справки: https://en.wikipedia.org/wiki/Everything_is_a_file]
Больше о дескрипторах файлов
Дескрипторы файлов (FD) - неотрицательные целые числа (0,1,2,...), которые связаны с открытым файлом.
0,1,2 являются стандартными FD, которые соответствуют STDIN_FILENO, STDOUT_FILENO и STDERR_FILENO. (определяется в unistd.h) открывается по умолчанию для имени оболочки при запуске программы.
FDs выделены в последовательном порядке, означает наименьшее возможное нераспределенное целочисленное значение.
FD для конкретного процесса можно увидеть в /proc/ $pid/fd (в системах на базе Unix)
В любой операционной системе работают процессы (p), например p1, p2, p3 и т.д. Каждый процесс обычно делает постоянное использование файлов.
Каждый процесс состоит из дерева процессов (или таблицы процессов, в другой фразировке).
Обычно операционные системы представляют каждый файл в каждом процессе по номеру (то есть в каждом дереве/таблице процессов).
Первым файлом, используемым в этом процессе, является файл0, второй - файл1, третий - файл2 и т.д.
Любое такое число является файловым дескриптором.
Дескрипторы файлов обычно являются целыми числами (0, 1, 2, а не 0,5, 1,5, 2,5).
Учитывая, что мы часто описываем процессы как "таблицы процессов" и учитывая, что в таблицах есть строки (записи), мы можем сказать, что ячейка дескриптора файла в каждой записи используется для представления всей записи.
Аналогично, когда вы открываете сетевой сокет, он имеет дескриптор сокета.
В некоторых операционных системах вы можете исчерпать дескрипторы файлов, но такой случай крайне редок, и средний пользователь компьютера не должен беспокоиться об этом.
Дескрипторы файлов могут быть глобальными (процесс A начинается с 0, и заканчивается в 1, процесс B начинается с 2, а заканчивается на 3) и т.д., но, насколько я знаю, обычно в современных операционных системы, дескрипторы файлов не являются глобальными и на самом деле зависят от процесса (процесс A начинается с 0, а заканчивается на 5, а процесс B начинается с 0, а заканчивается на 10).