Что такое файловые дескрипторы, объясненные простыми словами?
что было бы более упрощенным описанием файловых дескрипторов по сравнению с Википедии? Зачем они нужны? Скажем, возьмите процессы оболочки в качестве примера и как он применяется для этого?
таблица процессов содержит более одного файлового дескриптора. Если да, то почему?
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
areFILE*
, который в UNIX соответственно сопоставляется с файловыми дескрипторами0
,1
и2
.
услышать это из уст лошади: APUE (Ричард Стивенс).
В ядре все открытые файлы называются файловыми дескрипторами. Файловый дескриптор-это неотрицательное число.
когда мы открываем существующий файл или создать новый файл, ядро возвращает файловый дескриптор процесса. ядро поддерживает таблицу всех открытых файловых дескрипторов, которые используются. Выделение дескрипторов файлов обычно является последовательным, и они выделяются в файл в качестве следующего свободного файлового дескриптора из пула свободных файловых дескрипторов. Когда мы закрываем файл, дескриптор файла освобождается и доступен для дальнейшего выделения.
См. это изображение для получения более подробной информации:когда мы хотим прочитать или записать файл, то найдите файл с дескриптором файла, который был возвращен 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
:
File Descriptors
(FD) - неотрицательные целые числа(0, 1, 2, ...)
которые связаны с файлами, которые были открыты.
0, 1, 2
стандартные FD's, что соответствуетSTDIN_FILENO
,STDOUT_FILENO
иSTDERR_FILENO
(определена вunistd.h
) открывается по умолчанию от имени оболочки при запуске программы.FD выделяются в последовательном порядке, что означает минимально возможный нераспределенное целочисленное значение.
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
.Обратите также внимание, что таблица дескрипторов файлов, которую отслеживает ядро, не совпадает с таблицей файлов или таблицей индексов. Они разделены, как объяснили некоторые другие ответы.
вы можете спросить себя, где эти файловые дескрипторы физически и то, что хранится в
/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 файла всегда открыты
- стандартный ввод
- стандартный вывод
- Стандартная ошибка.
Эти файлы всегда присутствуют при запуске программы. Как объяснялось ранее файловый дескриптор, связан с каждым из эти файлы.
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: выход стандартной ошибки
- когда родительский процесс порождает процесс, дочерний процесс наследует файловые дескрипторы родителя