Что может быть более упрощенным описанием файловых дескрипторов по сравнению с Википедией? Зачем они нужны? Скажем, возьмем процессы оболочки в качестве примера и как это применимо к нему?
Содержит ли таблица процессов более одного дескриптора файла. Если да, то почему?
unix
operating-system
file-descriptor
Nishant
источник
источник
Ответы:
Проще говоря, когда вы открываете файл, операционная система создает запись для представления этого файла и сохранения информации об этом открытом файле. Таким образом, если в вашей ОС открыто 100 файлов, то в ОС будет 100 записей (где-то в ядре). Эти записи представлены целыми числами, такими как (... 100, 101, 102 ....). Этот номер записи является дескриптором файла. Так что это просто целое число, которое уникально представляет открытый файл в операционной системе. Если ваш процесс открывает 10 файлов, то ваша таблица процессов будет иметь 10 записей для файловых дескрипторов.
Аналогично, когда вы открываете сетевой сокет, он также представляется целым числом и называется дескриптором сокета. Я надеюсь, вы понимаете.
источник
/proc
.open()
даст вам файловый дескриптор 3, даже если другой запущенный процесс имеет файловый дескриптор 3. См. Определение POSIXopen()
: «Функция open () должна вернуть файловый дескриптор для именованного файла, который является самым низким дескриптор файла в данный момент не открыт для этого процесса . " (выделение добавлено).Файловый дескриптор - это непрозрачный дескриптор, который используется в интерфейсе между пользователем и пространством ядра для идентификации файловых / сокетных ресурсов. Следовательно, когда вы используете
open()
илиsocket()
(системные вызовы для взаимодействия с ядром), вы получаете файловый дескриптор, который является целым числом (на самом деле это индекс в структуре процессов, но это не важно). Поэтому, если вы хотите , чтобы непосредственно взаимодействовать с ядром, используя системные вызовыread()
,write()
, иclose()
т.д. ручка вы используете файловый дескриптор.На системные вызовы накладывается слой абстракции, который является
stdio
интерфейсом. Это обеспечивает больше функциональности / возможностей, чем базовые системные вызовы. Для этого интерфейса непрозрачный дескриптор, который вы получаете - этоFILE*
, который возвращаетсяfopen()
вызовом. Есть много много функций , которые используютstdio
интерфейсfprintf()
,fscanf()
,fclose()
, которые находятся там , чтобы сделать вашу жизнь проще. В Cstdin
,stdout
иstderr
естьFILE*
, что в UNIX соответственно карту для дескрипторов файлов0
,1
и2
.источник
Услышь это изо рта лошади: APUE (Ричард Стивенс).
В ядре все открытые файлы называются дескрипторами файлов. Файловый дескриптор является неотрицательным числом.
Когда мы открываем существующий файл или создаем новый файл, ядро возвращает файловый дескриптор процессу. Ядро поддерживает таблицу всех открытых дескрипторов файлов, которые используются. Распределение файловых дескрипторов, как правило, является последовательным, и они выделяются для файла в качестве следующего свободного файлового дескриптора из пула бесплатных файловых дескрипторов. Когда мы закрываем файл, дескриптор файла освобождается и доступен для дальнейшего выделения.
Смотрите это изображение для более подробной информации:
Когда мы хотим прочитать или записать файл, мы отождествляем файл с дескриптором файла, который был возвращен вызовом функции open () или create () , и используем его в качестве аргумента для read () или write () .
По соглашению системные оболочки UNIX связывают дескриптор файла 0 со стандартным вводом процесса, дескриптор файла 1 со стандартным выводом и дескриптор файла 2 со стандартной ошибкой .
Дескриптор файла варьируется от 0 до OPEN_MAX. Максимальное значение дескриптора файла можно получить с помощью
ulimit -n
. Для получения дополнительной информации просмотрите 3-ю главу книги APUE.источник
osqueryi <<< echo '.all process_open_files'
в оболочке bash.Другие ответы добавили отличные вещи. Я добавлю только мои 2 цента.
Согласно Википедии мы точно знаем: дескриптор файла является неотрицательным целым числом. Самая важная вещь, которую я считаю отсутствующей, это сказать:
Файловые дескрипторы привязаны к идентификатору процесса.
Мы знаем, что наиболее известные файловые дескрипторы - это 0, 1 и 2. 0 соответствует
STDIN
, 1 кSTDOUT
и 2 кSTDERR
.Проверьте этот код
Мы создали процесс с идентификатором 14726 (PID). Используя
lsof -p 14726
мы можем получить такие вещи:Четвертый столбец FD и следующий столбец TYPE соответствуют дескриптору файла и типу дескриптора файла.
Некоторые значения для FD могут быть:
Но настоящий дескриптор файла находится под:
Символ после числа, т.е. «1u», представляет режим, в котором файл открывается. r для чтения, w для записи, u для чтения и записи.
TYPE указывает тип файла. Некоторые из значений типов:
Но все файловые дескрипторы являются CHR - символьный специальный файл (или файл символьного устройства)
Теперь мы можем определить дескрипторы файлов для
STDIN
,STDOUT
иSTDERR
легко сlsof -p PID
, или мы можем увидеть то же самое , если мыls /proc/PID/fd
.Также обратите внимание, что таблица файловых дескрипторов, которую отслеживает ядро, отличается от таблицы файлов или таблицы inode. Это отдельные, как объяснили некоторые другие ответы.
Вы можете спросить себя, где эти файловые дескрипторы физически и что хранится,
/dev/pts/6
например, вНу,
/dev/pts/6
живет чисто в памяти. Это не обычные файлы, а так называемые файлы символьных устройств . Вы можете проверить это с помощью:ls -l /dev/pts/6
и они начнутся сc
, в моем случаеcrw--w----
.Напомним, что большинство Linux-подобных ОС определяют семь типов файлов:
источник
Больше очков относительно
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).источник
В дополнение к другим ответам, Unix рассматривает все как файловую систему. Ваша клавиатура - это файл, который читается только с точки зрения ядра. Экран - это файл только для записи. Аналогично, папки, устройства ввода-вывода и т. Д. Также считаются файлами. Когда файл открывается, скажем, когда драйверы устройств [для файлов устройств] запрашивают open (), или процесс открывает пользовательский файл, ядро выделяет дескриптор файла, целое число, которое определяет доступ к этому файлу, так что он доступен только для чтения. , пишите только и т. д. [для справки: https://en.wikipedia.org/wiki/Everything_is_a_file ]
источник
Файловые дескрипторы (FD):
Перенаправление ошибок:
каждом запуске программы / команды в терминале всегда открыто 3 файла.
Эти файлы всегда присутствуют при запуске программы. Как объяснено ранее файловый дескриптор, связан с каждым из этих файлов.
Файл Дескриптор файла
Стандартный вход STDIN 0
Стандартный выход STDOUT 1
Стандартная ошибка STDERR 2
Пример 1
Дескриптор файла для стандартной ошибки: 2.
Если нет каталога с именем mydir, выходные данные команды будут сохранены в файл errorfile.txt.
Используя «2>», мы перенаправим вывод ошибок в файл с именем «errorfile». txt "
Таким образом, вывод программы не загроможден ошибками.
Я надеюсь, что вы получили свой ответ.
источник
В любой операционной системе запущены процессы (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).
источник
Файловые дескрипторы
источник
Помимо всего прочего упрощенные ответы.
Если вы работаете с файлами в bash-скрипте, лучше использовать файловый дескриптор.
Например: -
Вы хотите читать и писать из / в файл «test.txt».
Используйте дескриптор файла, как показано ниже
источник
Файловые дескрипторы являются дескрипторами файла. Они дают ссылки на файл. С их помощью мы можем читать, писать и открывать файл.
источник