Что такое файловые дескрипторы, объясняемые простыми словами?

234
  • Что будет более упрощенным описанием файловых дескрипторов по сравнению с Википедии? Зачем они нужны? Скажем, возьмите в качестве примера процессы оболочки и как это применимо к нему?

  • В таблице процессов содержится более одного дескриптора файла. Если да, то почему?

  • 3
    А как насчет концепции stdin stdout stderr и т. Д.? У меня есть экземпляр, например, сказать, что процесс браузера открыт, и он открыл некоторые временные файлы для отображения моего HTML. Процесс использует тот же FD для чтения / записи? Кроме того, таблица процессов ....... имеет записи, такие как указатель fd0 указатель fd1 указатель fd2 ..... означает ли это, что все эти файлы находятся в оперативной памяти? Почему еще указатели?
  • 26
    Когда вы открываете файл, ОС создает поток для этого файла и подключает этот поток к открытому файлу, дескриптор фактически представляет этот поток. Точно так же есть некоторые потоки по умолчанию, созданные ОС. Эти потоки подключены к вашему терминалу, а не к файлам. Поэтому, когда вы пишете что-то в терминале, оно идет в поток stdin и ОС. И когда вы пишете команду «ls» на терминале, ОС записывает вывод в поток stdout. Поток stdout подключен к терминалу вашего монитора, поэтому вы можете видеть выходной сигнал.
Показать ещё 9 комментариев
Теги:
operating-system
file-descriptor

6 ответов

370
Лучший ответ

Простыми словами при открытии файла операционная система создает запись для представления этого файла и сохраняет информацию об этом открывшемся файле. Итак, если в вашей ОС открыто 100 файлов, то в ОС будет находиться 100 записей (где-то в ядре). Эти записи представлены целыми числами типа (... 100, 101, 102....). Этот номер записи является файловым дескриптором. Таким образом, это просто целое число, которое уникально представляет собой открытый файл в операционной системе. Если ваш процесс откроет 10 файлов, ваша таблица процессов будет содержать 10 записей для дескрипторов файлов.

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

  • 0
    Отличный тайяб. Я добавил несколько комментариев в вопрос, пожалуйста, ответьте на это тоже.
  • 6
    Кроме того, именно поэтому вы можете исчерпать файловые дескрипторы, если открываете много файлов одновременно. Что помешает запуску систем * nix, так как они постоянно открывают дескрипторы для добавления в /proc .
Показать ещё 14 комментариев
79

Дескриптор файла - это непрозрачный дескриптор, который используется в интерфейсе между пространством пользователя и ядра для идентификации ресурсов файла/сокета. Поэтому, когда вы используете open() или socket() (системные вызовы для интерфейса с ядром), вам предоставляется дескриптор файла, который является целым числом (это фактически индекс в структуре процессов u, но это не важно). Поэтому, если вы хотите напрямую взаимодействовать с ядром, используя системные вызовы read(), write(), close() и т.д. Дескриптор, который вы используете, является файловым дескриптором.

На системных вызовах имеется слой абстракции, который является интерфейсом stdio. Это обеспечивает больше функциональности/функций, чем это делают основные системные вызовы. Для этого интерфейса непрозрачным дескриптором вы получаете FILE*, который возвращается вызовом fopen(). Существует много функций, которые используют интерфейс stdio fprintf(), fscanf(), fclose(), которые помогут вам сделать вашу жизнь проще. В C, stdin, stdout и stderr находятся FILE*, которые в UNIX соответственно сопоставляются файловым дескрипторам 0, 1 и 2.

  • 5
    Я лично считаю, что этот ответ лучше, чем тот, который помечен как ответ. Upvoted.
71

Услышьте его от Лошадиного устья: APUE (Ричард Стивенс).
К ядру все открытые файлы упоминаются файловыми дескрипторами. Дескриптор файла является неотрицательным числом.
Когда мы открываем существующий файл или создаем новый файл, ядро ​​возвращает дескриптор файла в процесс. Ядро поддерживает таблицу всех открытых дескрипторов файлов, которые используются. Выделение файловых дескрипторов, как правило, является последовательным, и они привязаны к файлу как следующий свободный дескриптор файла из пула свободных файловых дескрипторов. Когда мы закрываем файл, дескриптор файла освобождается и доступен для дальнейшего выделения.
См. Это изображение для получения дополнительной информации:
Изображение 7823

Когда мы хотим прочитать или записать файл, мы идентифицируем файл с файловым дескриптором, который был вызван вызовом функции open() или create(), и используйте его как аргумент для read() или write().
По общему мнению, оболочки UNIX связывают файловый дескриптор 0 с стандартным входом процесса, дескриптор файла 1 с стандартным выходом и дескриптор файла 2 с Стандартная ошибка.
Дескриптор файла варьируется от 0 до OPEN_MAX.
Для получения дополнительной информации перейдите к третьей главе книги APUE.

  • 0
    Поскольку 0, 1, 2 связаны с «stdin», «stdout» и «stderr» процесса, можем ли мы использовать эти дескрипторы одновременно для разных процессов?
  • 0
    @Tarik: файловые дескрипторы для каждого процесса. Чтобы увидеть это, загрузите osquery и выполните osqueryi <<< echo '.all process_open_files' в оболочке bash.
11

В дополнение к другим ответам, unix рассматривает все как файловую систему. Ваша клавиатура - это файл, который читается только с точки зрения ядра. Экран - это файл только для записи. Аналогичным образом, папки, устройства ввода-вывода и т.д. Также считаются файлами. Всякий раз, когда файл открывается, скажите, когда драйверы устройства [для файлов устройства] запрашивают open() или процесс открывает файл пользователя, ядро ​​выделяет файловый дескриптор, целое число, которое указывает доступ к этому файлу, такое, что оно доступно только для чтения, писать только и т.д. [для справки: https://en.wikipedia.org/wiki/Everything_is_a_file]

  • 0
    Файловые дескрипторы могут также ссылаться на вещи, которые не существуют в файловой системе, такие как анонимные каналы и сетевые сокеты.
8

Больше о дескрипторах файлов

  • Дескрипторы файлов (FD) - неотрицательные целые числа (0,1,2,...), которые связаны с открытым файлом.

  • 0,1,2 являются стандартными FD, которые соответствуют STDIN_FILENO, STDOUT_FILENO и STDERR_FILENO. (определяется в unistd.h) открывается по умолчанию для имени оболочки при запуске программы.

  • FDs выделены в последовательном порядке, означает наименьшее возможное нераспределенное целочисленное значение.

  • FD для конкретного процесса можно увидеть в /proc/ $pid/fd (в системах на базе Unix)

1

В любой операционной системе работают процессы (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).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню