Дескриптор файла что это
Файловый дескриптор
Ко всем потокам ввода-вывода (которые могут быть связаны как с файлами, так и с папками, сокетами и FIFO) можно получить доступ через так называемые файловые дескрипторы. Файловый дескриптор — это неотрицательное целое число. Когда создается новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор.
По умолчанию Unix-оболочки связывают файловый дескриптор 0 с потоком стандартного ввода процесса (терминал), файловый дескриптор 1 — с потоком стандартного вывода (терминал), и файловый дескриптор 2 — с потоком диагностики (куда обычно выводятся сообщения об ошибках). Это соглашение соблюдается многими Unix-оболочками и многими приложениями — и ни в коем случае не является составной частью ядра.
Стандарт POSIX.1 заменил «магические числа» 0, 1, 2 символическими константами STDIN_FILENO, STDOUT_FILENO и STDERR_FILENO соответственно.
Файловые дескрипторы могут принимать значения от 0 до OPEN_MAX. Согласно POSIX.1, значение OPEN_MAX равно 19. В реальных ОС это значение может быть больше.
См. также
Полезное
Смотреть что такое «Файловый дескриптор» в других словарях:
Дескриптор — (англ. Descriptor): Дескриптор HTML элемент языка разметки гипертекста HTML. В разговорной речи дескрипторы называют тегами. Дескриптор развертывания XML файлы, которые описывают, как развернуть модули. Файловый дескриптор число… … Википедия
Epoll — (extended poll) API асинхронного ввода вывода, предоставляемого Linux для приложений. API позволяет приложениям осуществлять мониторинг нескольких открытых файловых дескрипторов (которые могут быть файлами, устройствами или сокетами, в том… … Википедия
Perl — Семантика: мультипарадигменный: императивный, объектно ориентированный, функциональный Тип исполнения: интерпретатор Появился в: 1987 Автор(ы) … Википедия
Перл (язык программирования) — Perl Семантика: мультипарадигменный: императивный, объектно ориентированный, функциональный Тип исполнения: интерпретатор Появился в: 1987 г. Автор(ы): Ларри Уолл … Википедия
Inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. В основное ядро была включена начиная с 2.6.13, но может использоваться и с более ранними ядрами с помощью наложения патча. Основная сфера… … Википедия
inotify — это подсистема ядра Linux, которая позволяет получать уведомления об изменениях в файловой системе. В основное ядро была включена начиная с 2.6.13, но может использоваться и с более ранними ядрами с помощью наложения патча. Основная сфера… … Википедия
Перенаправление (UNIX) — У этого термина существуют и другие значения, см. Перенаправление. В информатике перенаправление это возможность присущая многим командным оболочкам, таким как командные оболочки UNIX, позволяющая перенаправлять стандартные потоки в… … Википедия
Перенаправление (программное обеспечение) — У этого термина существуют и другие значения, см. Перенаправление. В информатике перенаправление это возможность присущая многим командным оболочкам, таким как командные оболочки UNIX, позволяющая перенаправлять стандартные потоки в… … Википедия
Сокет (программный интерфейс) — У этого термина существуют и другие значения, см. Сокет. Сокеты (англ. socket углубление, гнездо, разъём) название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на… … Википедия
Решение задания с pwnable.kr 01 — fd. Файловые дескрипторы и процессы
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Файловые дескрипторы
Файловый дескриптор — это неотрицательное число, которое является идентификатором какого-либо потока ввода-вывода, который может быть связан с файлами, каталогами или сокетами.
В системной файловой таблице (SFT — System File Table) и таблице индексных дескрипторов (INode Table) содержится информация, необходимая для доступа процесса к данным файла. Если несколько процессов запрашивают доступ к одному и тому же файлу, то каждый из тих процессов получит собственный элемент системной файловой таблицы, несмотря на то что они будут работать с одним и тем же файлом.
Ядро предоставляет процессу файловый дескриптор, когда тот получает доступ к файлу. Можно сказать, что файловый дескриптор — это индекс массива открытых файлов, который является уникальным для каждого процесса. Но первые три индекса жестко закреплены:
Решение задания fd
Нажимаем на первую иконку с подписью fd, и нам говорят, что нужно подключиться по SSH с паролем guest.
При подключении мы видим соотвтствующий баннер.
Давайте узнаем какие файлы есть на сервере, а также какие мы имеем права.
Таким образом мы можем можем прочитать исходный код программы, так как есть право читать для всех, и выполнить с правами владельца программу fd (установлен sticky-бит). Давай просмотрим исходный код.
Из кода следует, что программа принимает в качестве параметра число, отнимает от него 0x1234 и использует в качестве дескриптора для получения строки, которая должна быть равна «LETMEWIN».
Таким образом нам нужно послать программе строку «LETMEWIN» через стандартный поток ввода (stdin). Для этого дескриптор, который передается в функцию read(), должен быть равен 0. То есть в качестве параметра программы нужно использовать число 0х1234. Переведем его в десятичный вид.
Теперь запустим программу с параметром 4660, отпавим нужную строку и заберем флаг.
Что такое файловые дескрипторы, объясняемые простыми словами?
Что может быть более упрощенным описанием файловых дескрипторов по сравнению с Википедией? Зачем они нужны? Скажем, возьмем процессы оболочки в качестве примера и как это применимо к нему?
Содержит ли таблица процессов более одного дескриптора файла. Если да, то почему?
Аналогично, когда вы открываете сетевой сокет, он также представляется целым числом и называется дескриптором сокета. Я надеюсь, вы понимаете.
Услышь это изо рта лошади: APUE (Ричард Стивенс).
В ядре все открытые файлы называются дескрипторами файлов. Файловый дескриптор является неотрицательным числом.
Когда мы открываем существующий файл или создаем новый файл, ядро возвращает файловый дескриптор процессу. Ядро поддерживает таблицу всех открытых дескрипторов файлов, которые используются. Распределение файловых дескрипторов, как правило, является последовательным, и они выделяются для файла в качестве следующего свободного файлового дескриптора из пула бесплатных файловых дескрипторов. Когда мы закрываем файл, дескриптор файла освобождается и доступен для дальнейшего выделения.
Смотрите это изображение для более подробной информации:
Другие ответы добавили отличные вещи. Я добавлю только мои 2 цента.
Согласно Википедии мы точно знаем: дескриптор файла является неотрицательным целым числом. Самая важная вещь, которую я считаю отсутствующей, это сказать:
Файловые дескрипторы привязаны к идентификатору процесса.
Скажем, возьмем процессы оболочки в качестве примера и как это применимо к нему?
Проверьте этот код
Четвертый столбец FD и следующий столбец TYPE соответствуют дескриптору файла и типу дескриптора файла.
Некоторые значения для FD могут быть:
Но настоящий дескриптор файла находится под:
Символ после числа, т.е. «1u», представляет режим, в котором файл открывается. r для чтения, w для записи, u для чтения и записи.
TYPE указывает тип файла. Некоторые из значений типов:
Также обратите внимание, что таблица файловых дескрипторов, которую отслеживает ядро, отличается от таблицы файлов или таблицы inode. Это отдельные, как объяснили некоторые другие ответы.
Вы можете спросить себя, где эти файловые дескрипторы физически и что хранится, /dev/pts/6 например, в
Напомним, что большинство Linux-подобных ОС определяют семь типов файлов:
Что такое дескрипторы файлов, объясненные простыми словами?
Что будет более упрощенным описанием файловых дескрипторов по сравнению с Википедии? Зачем они нужны? Скажем, возьмите в качестве примера процессы оболочки и как это применимо к нему?
В таблице процессов содержится более одного дескриптора файла. Если да, то почему?
ОТВЕТЫ
Ответ 1
Простыми словами при открытии файла операционная система создает запись для представления этого файла и сохраняет информацию об этом открывшемся файле. Итак, если в вашей ОС открыто 100 файлов, то в ОС будет находиться 100 записей (где-то в ядре). Эти записи представлены целыми числами типа (. 100, 101, 102. ). Этот номер записи является файловым дескриптором. Таким образом, это просто целое число, которое уникально представляет собой открытый файл в операционной системе. Если ваш процесс откроет 10 файлов, ваша таблица процессов будет содержать 10 записей для дескрипторов файлов.
Аналогично, когда вы открываете сетевой сокет, он также представляется целым числом и называется дескриптором Socket. Надеюсь, вы понимаете.
Ответ 2
Ответ 3
Когда мы открываем существующий файл или создаем новый файл, ядро возвращает файловый дескриптор процессу. Ядро поддерживает таблицу всех открытых дескрипторов файлов, которые используются. Выделение файловых дескрипторов, как правило, является последовательным, и они выделяются для файла в качестве следующего свободного файлового дескриптора из пула бесплатных файловых дескрипторов. Когда мы закрываем файл, дескриптор файла освобождается и становится доступным для дальнейшего выделения.
Смотрите это изображение для более подробной информации:
Ответ 4
Ответ 5
Еще несколько пунктов относительно File Descriptor :
FD распределяются в последовательном порядке, что означает наименьшее возможное нераспределенное целочисленное значение.
FD для конкретного процесса можно увидеть в /proc/$pid/fd (в системах на основе Unix).
Ответ 6
Другие ответы добавили отличные вещи. Я добавлю только мои 2 цента.
Согласно Википедии мы точно знаем: дескриптор файла является неотрицательным целым числом. Самая важная вещь, которую я считаю отсутствующей, это сказать:
Файловые дескрипторы привязаны к идентификатору процесса.
Скажем, возьмем процессы оболочки в качестве примера и как это применимо к нему?
Проверьте этот код
Четвертый столбец FD и следующий столбец TYPE соответствуют дескриптору файла и типу дескриптора файла.
Некоторые значения для FD могут быть:
Но настоящий дескриптор файла находится под:
Символ после числа, т.е. «1u», представляет режим, в котором открывается файл. r для чтения, w для записи, u для чтения и записи.
TYPE указывает тип файла. Некоторые из значений типов:
Также обратите внимание, что таблица файловых дескрипторов, которую отслеживает ядро, отличается от таблицы файлов или таблицы inode. Это отдельные, как объяснили некоторые другие ответы.
Вы можете спросить себя, где физически находятся эти файловые дескрипторы и что, например, хранится в /dev/pts/6
Напомним, что большинство Linux-подобных ОС определяют семь типов файлов:
Ответ 7
Файловые дескрипторы (FD):
Я надеюсь, что вы получили свой ответ.
Ответ 8
В любой операционной системе работают процессы (p), например p1, p2, p3 и т.д. Каждый процесс обычно делает постоянное использование файлов.
Каждый процесс состоит из дерева процессов (или таблицы процессов, в другой фразировке).
Обычно операционные системы представляют каждый файл в каждом процессе по номеру (то есть в каждом дереве/таблице процессов).
Любое такое число является файловым дескриптором.
Дескрипторы файлов обычно являются целыми числами (0, 1, 2, а не 0,5, 1,5, 2,5).
Учитывая, что мы часто описываем процессы как «таблицы процессов» и учитывая, что в таблицах есть строки (записи), мы можем сказать, что ячейка дескриптора файла в каждой записи используется для представления всей записи.
Аналогично, когда вы открываете сетевой сокет, он имеет дескриптор сокета.
В некоторых операционных системах вы можете исчерпать дескрипторы файлов, но такой случай крайне редок, и средний пользователь компьютера не должен беспокоиться об этом.
Дескрипторы файлов могут быть глобальными (процесс A начинается с 0, и заканчивается в 1, процесс B начинается с 2, а заканчивается на 3) и т.д., но, насколько я знаю, обычно в современных операционных системы, дескрипторы файлов не являются глобальными и на самом деле зависят от процесса (процесс A начинается с 0, а заканчивается на 5, а процесс B начинается с 0, а заканчивается на 10).
Ответ 9
Файловые дескрипторы
Ответ 10
Помимо всего прочего упрощенные ответы.
Если вы работаете с файлами в bash-скрипте, лучше использовать файловый дескриптор.
Например:-
Вы хотите читать и писать из/в файл «test.txt».
Используйте дескриптор файла, как показано ниже
Ответ 11
Файловые дескрипторы являются дескрипторами файла. Они дают ссылки на файл. С их помощью мы можем читать, писать и открывать файл.
Русские Блоги
Глава 3 File IO | 001 Файловый дескриптор
1. Обзор
Описание файла и соответствующая модель открытого файла следующие:
2. Ограничения описания файлов
3. Описание файла соответствует отношениям между открытыми файлами.
Каждый дескриптор файла будет соответствовать открытому файлу, и в то же время разные файловые дескрипторы также будут указывать на один и тот же файл. Один и тот же файл может быть открыт разными процессами или несколько раз в одном и том же процессе. Система поддерживает таблицу дескрипторов файлов для каждого процесса. Значение этой таблицы начинается с 0, поэтому вы увидите один и тот же дескриптор файла в разных процессах. В этом случае один и тот же дескриптор файла может быть Он указывает на один и тот же файл или может указывать на другой файл. Конкретная ситуация должна быть проанализирована подробно, чтобы понять конкретный обзор, вам необходимо просмотреть три структуры данных, поддерживаемые ядром.
1. Таблица дескрипторов файлов уровня процесса
2. Таблица дескрипторов открытых файлов системного уровня
3. Таблица i-узлов файловой системы
Каждая запись в таблице дескрипторов уровня процесса записывает информацию об одном дескрипторе файла.
Набор флагов, которые управляют работой файловых дескрипторов. (В настоящее время определен только один такой флаг, а именно флаг close-on-exec)
Ссылка на дескриптор открытого файла
Ядро поддерживает таблицу дескрипторов системного уровня (таблицу описания открытых файлов) для всех файлов открытых файлов. Иногда это также называется таблицей открытых файлов (open file table), и каждая запись в таблице называется дескриптором открытого файла (дескриптор открытого файла). Дескриптор открытого файла хранит всю информацию, связанную с открытым файлом, следующим образом:
Текущее смещение файла (обновляется при вызове read () и write (), или напрямую изменяется с помощью lseek ())
Флаг состояния, используемый при открытии файла (т. Е. Параметр flags open ())
Режим доступа к файлу (например, режим только для чтения, режим только для записи или режим чтения-записи, установленный при вызове open ())
Настройки, связанные с сигнальным диском
Ссылка на объект i-узла файла
Тип файла (например: обычный файл, сокет или FIFO) и права доступа
Указатель на список блокировок, удерживаемых файлом
Различные атрибуты файла, включая размер файла и временные метки, связанные с различными типами операций
На следующем рисунке показана взаимосвязь между дескрипторами файлов, дескрипторами открытых файлов и i-узлами.На рисунке два процесса имеют много дескрипторов открытых файлов.
3. Копия файлового дескриптора
В процессе А файловый дескриптор 1 и файловый дескриптор 20 оба указывают на одно и то же тело описания открытого файла (метка 23). Скорее всего, это формируется путем вызова ряда функций dup ().
Копирование файлового дескриптора очень полезно в определенных сценариях, таких как: стандартное перенаправление ввода / вывода. Под оболочкой, эта операция очень проста, большинство людей, но мало кто задумывался о принципе.
Кратко опишите необходимые шаги, взяв в качестве примера перенаправление стандартного вывода (дескриптор файла 1):
Откройте целевой файл и верните дескриптор файла n;
закрыть дескриптор файла 1;
вызовите dup, чтобы скопировать дескриптор файла n в 1;
закрыть дескриптор файла n;
4. Дочерний процесс наследует файловый дескриптор
Файловый дескриптор 2 процесса A и файловый дескриптор 2 процесса B оба указывают на одно и то же тело описания открытого файла (ссылочный номер 73). Такая ситуация может возникнуть после вызова fork () для получения дочернего процесса, такого как A, вызывающего fork () для получения B. В это время, как дочерний процесс, B наследует таблицу дескрипторов файлов от родительского процесса A, который включает дескриптор 2 файлов, указанный на рисунке. Здесь дочерний процесс наследует файл, открытый родительским процессом.
Конечно, похожая ситуация возникает, когда процесс A передает дескриптор файла в B через сокет Unix, но общее значение дескриптора файла отличается. В то же время, требуется 2 совпадения.
5. Резюме
Из-за существования таблиц файловых дескрипторов уровня процесса одни и те же файловые дескрипторы будут появляться в разных процессах, они могут указывать на один и тот же файл или они могут указывать на разные файлы.
Два разных файловых дескриптора, если они указывают на один и тот же дескриптор открытого файла, будут иметь одинаковое смещение файла. Следовательно, если смещение файла изменяется одним из файловых дескрипторов (из-за вызовов read (), write () или lseek ()), то изменение также будет наблюдаться из другого дескриптора, независимо от двух Принадлежит ли файловый дескриптор разным процессам или один и тот же процесс.
Чтобы получить и изменить флаги открытого файла (например, O_APPEND, O_NONBLOCK и O_ASYNC), вы можете выполнить операции f_GETFL и F_SETFL для fcntl (), а ограничения области действия очень похожи на предыдущие.
Флаг дескриптора файла (то есть close-on-exec) является частным для процесса и дескриптора файла. Изменение этого флага не повлияет на другие файловые дескрипторы в том же процессе или в разных процессах.