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


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

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

10 270

10 ответов:

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

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

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

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

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

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

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

больше очков в отношении File Descriptor:

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

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

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

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

любая операционная система имеет запущенные процессы (p), скажем p1, p2, p3 и так далее. Каждый процесс обычно делает постоянное использование файлов.

каждый процесс состоит из дерева процессов (или таблицы процессов, в другой формулировке).

обычно операционные системы представляют каждый файл в каждом процессе на (то есть в каждом процессе дерево/стол).

первый файл, используемый в процессе file0, второй - file1, третий - file2 и так далее.

любое такое число является дескриптором файла.

файловые дескрипторы, как правило, целые числа (0, 1, 2, а не 0.5, 1.5, 2.5).

учитывая, что мы часто описываем процессы как "таблицы процессов", и учитывая, что таблицы имеют строки (записи), мы можем сказать, что ячейка дескриптора файла в каждой записи используется для представления всей записи.

в аналогичной кстати, когда вы открываете сетевой сокет, он имеет дескриптор сокета.

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

файловые дескрипторы могут быть глобальными (процесс A начинается с 0 и заканчивается 1 ; Процесс B начинается с 2 и заканчивается 3) и т. д., Но, насколько я знаю, обычно в современных операционных системах файловые дескрипторы не являются глобальными и являются на самом деле конкретного процесса (процесс начинается в 0 и заканчивается скажем в 5, в то время как процесс B начинается в 0 и заканчивается скажем в 10).

другие ответы добавили отличный материал. Я добавлю только мои 2 цента.

согласно Википедии мы точно знаем: дескриптор файла является неотрицательным целым числом. Самое главное, что я думаю, отсутствует, было бы сказать:

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

мы знаем, что самые известные файловые дескрипторы-это 0, 1 и 2. 0 соответствует STDIN, 1 в STDOUT и 2 в STDERR.

скажем, взять процессы оболочки в качестве примера и как он применяется для этого?

проверьте этот код

#>sleep 1000 &
[12] 14726

мы создали процесс с идентификатором 14726 (PID). Используя lsof -p 14726 мы можем получить такие вещи:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   14726 root  cwd    DIR    8,1     4096 1201140 /home/x
sleep   14726 root  rtd    DIR    8,1     4096       2 /
sleep   14726 root  txt    REG    8,1    35000  786587 /bin/sleep
sleep   14726 root  mem    REG    8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep   14726 root  mem    REG    8,1  2030544  137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep   14726 root  mem    REG    8,1   170960  137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

4-й столбец FD и самый Следующий тип столбца соответствуют файловому дескриптору и типу файлового дескриптора.

некоторые значения для FD могут быть:

cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device

но реальный дескриптор файла под:

NUMBER – Represent the actual file descriptor. 

символ после числа, т. е." 1u", представляет режим, в котором файл открыт. R для чтения, W-для записи, для чтения и записи.

тип указывает тип файла. Некоторые из значений типов:

REG – Regular File
DIR – Directory
FIFO – First In First Out

но все файловые дескрипторы CHR-символьный специальный файл (или файл символьного устройства)

теперь мы можем определить дескрипторов STDIN,STDOUT и STDERR легко lsof -p PID, или мы можем увидеть то же самое, если мы ls /proc/PID/fd.

Обратите также внимание, что таблица дескрипторов файлов, которую отслеживает ядро, не совпадает с таблицей файлов или таблицей индексов. Они разделены, как объяснили некоторые другие ответы.

fd table

вы можете спросить себя, где эти файловые дескрипторы физически и то, что хранится в /dev/pts/6 например

sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

Ну /dev/pts/6 живет исключительно в памяти. Это не обычные файлы, но так называется файлы символьных устройств. Вы можете проверить это с: ls -l /dev/pts/6 и они начнут с c в моем случае crw--w----.

просто чтобы вспомнить большинство Linux, как ОС определить семь типов файлов:

  • обычные файлы
  • каталоги
  • файлы символьных устройств
  • блокировать файлы устройств
  • локальные сокеты
  • именованные каналы (FIFOs) и
  • символические ссылки

файловые дескрипторы (FD) :

  • на Linux / Unix, все это файл. Обычный файл, каталоги, и даже устройства-это файлы. Каждый файл имеет связанный номер, называемый файловым дескриптором (FD).
  • ваш экран также имеет файловый дескриптор. Когда программа выполняется вывод отправляется в файловый дескриптор экрана, и вы видите вывод программы на монитор. Если вывод отправляется в файл Дескриптор принтера, выходные данные программы могут быть напечатанный.

    Ошибка Перенаправления :
    Всякий раз, когда вы выполняете программу / команду на терминале, 3 файла всегда открыты
    1. стандартный ввод
    2. стандартный вывод
    3. Стандартная ошибка.

    Эти файлы всегда присутствуют при запуске программы. Как объяснялось ранее файловый дескриптор, связан с каждым из эти файлы.
    File Дескриптор
    Стандартный ввод стандартный ввод, 0
    Стандартный выход STDOUT 1
    Стандартная ошибка STDERR 2

  • например, при поиске файлов, одним как правило, получает отказано в разрешении ошибки или некоторые другие виды ошибок. Эти ошибки могут быть сохранены в отдельный файл.
    Пример 1

$ ls mydir 2>errorsfile.txt

дескриптор файла для стандартной ошибки 2.
Если нет никакого каталога с именем mydir, то вывод команды будет сохранен в файл errorfile.txt
Используя "2>", мы перенаправляем вывод ошибок в файл с именем " errorfile.txt"
Таким образом, вывод программы не загроможден ошибками.

Я надеюсь, что вы получили свой ответ.

файловые дескрипторы

  • к ядру все открытые файлы относятся по дескрипторам файлов.
  • файловый дескриптор-это неотрицательное целое число.
  • когда мы открываем существующий или создаем новый файл, ядро возвращает файловый дескриптор процессу.
  • когда мы хотим прочитать или записать файл, мы идентифицируем файл с дескриптором файла, который был перенастроен с помощью open или create, в качестве аргумента для чтения или записи.
  • каждый процесс UNIX имеет 20 файловых дескрипторов и его утилизацию, пронумерованные от 0 до 19, но он был расширен до 63 многими системами.
  • Первые три уже открыты, когда процесс начинается 0: стандартный ввод 1: стандартный вывод 2: выход стандартной ошибки
  • когда родительский процесс порождает процесс, дочерний процесс наследует файловые дескрипторы родителя

файловые дескрипторы-это дескрипторы файла. Они дают ссылки на файл. С их помощью мы можем читать, писать и открывать файлы.