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


12

Мне было интересно, какие различия и отношения между дескрипторами файлов и именами файлов. Все ли они используются для доступа к файлам? Если да, то же самое?

Так , например, /dev/fd/0, /dev/stdinи /proc/self/fd/0все ссылки на /dev/pts/2. Это четыре дескриптора файла или имена файла?


Ответы:


12

Все четверо /dev/fd/0, /dev/stdin, /proc/self/fd/0и /dev/pts/2имена файлов, так же как /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijfи т.д. Все , но это последний пример, скорее всего, имя существующего файла на вашем компьютере. Имя файла - это строка, которая может обозначать файл в вашей файловой системе; в Linux любая строка, которая не содержит нулевой байт и имеет длину не более 4096 байт, является допустимым именем файла. Многие из этих имен эквивалентны, например , /bin/shэквивалентны ///bin/sh, /bin/../bin/sh(предполагая , что /binэто существующий каталог) и т.д. Все эти примеры я дал до сих пор абсолютные имена файлов; Существуют также относительные имена файлов, которые не начинаются с a /и значение которых зависит от текущего каталога.

Терминология вокруг имен файлов не является универсальной; иногда «имя файла» означает полный путь к файлу, а иногда это означает имя записи каталога. Терминология POSIX - это « имя файла » или « компонент пути » для имени записи каталога и « путь » для полного пути.

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

Файловые дескрипторы могут соответствовать файлу и иметь ассоциированное имя, но не все они имеют. Для тех, кто это делает, файл может быть обычным файлом, каталогом, файлом устройства или именованным каналом (также называемым FIFO) (тип, созданный mkfifo); Некоторые системы имеют дополнительные возможности, такие как Unix-розетки и двери. Примеры дескрипторов файлов, у которых нет связанного именованного файла, включают каналы (вид, созданный pipe) и сетевые сокеты .

/dev/fd/0, /dev/stdinИ /proc/self/fd/0имена файлов (все эквивалент) с особенным значением: они все обозначают какой файл в настоящее время доступно через дескриптор файла 0. Когда процесс открывает их, копия ядра записи с индексом 0 в таблице дескрипторов дескрипторов файлов на новый дескриптор. Открытие любого из этих файлов эквивалентно вызову dup(0). Названные файлы - это способ косвенно заставить процесс использовать один из его уже открытых файлов, а не открывать новый файл; они в основном полезны для передачи в командной строке программы, где программа ожидает имя файла, который нужно открыть.


@Giles Вы написали «Каждая запись в таблице дескрипторов файлов указывает, что делать, если процесс запрашивает чтение, запись и другие операции над дескриптором файла.» ( Выделено мое). Насколько я понял, это просто целое число, подобное стандартному 0,1,2 и т. Д. Для stdin, stdout и stderr соответственно. Это были бы более ценные числа для обычных файлов. Что я не получаю от вашего комментария, так это то, как это число указывает «что делать, если процесс запрашивает чтение, запись и другие операции над дескриптором файла». , Не могли бы вы немного рассказать об этом?
Компьютерщик

@Geek Запись в таблице дескрипторов файлов не является числом. Номер является индексом в этой таблице.
Жиль "ТАК - перестань быть злым"

@ Джайлз спасибо за разъяснение моего недоразумения. Теперь я понимаю это лучше. Поэтому, пожалуйста, приведите пример части «что делать» в своем ответе. Я понял, что каждая запись в таблице дескрипторов файлов снова содержит указатель на таблицу файлов, которая содержит такую ​​информацию, как смещение файла, состояние файла и т. Д. Но я до сих пор не понимаю, что «делать» в части вашего ответа.
Компьютерщик

2

Filename - это просто имя файла в файловой системе, ничего более - это просто строка.

Файловый дескриптор - это какой-то объект, откуда вы можете читать и / или писать. Это открытый и готовый файл. Существуют не только файловые дескрипторы - stdin, stdout и stderr также являются дескрипторами, вы можете писать и читать из них, используя абсолютно те же функции, что и с файлами (за исключением того, что вы не можете, например, искать). Другие примеры дескрипторов, которые не являются файлами: именованные каналы и сетевые сокеты.

В коде файловый дескриптор - это переменная, указатель на что-то в ядре, представляющий объект файла.

Например, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 являются ссылками на / dev / pts / 2. Это четыре дескриптора файла или имена файла?

Это все псевдофайлы, которые могут быть полезны для некоторых скриптов или программ. Вы можете открыть их и открыть () вернет вам дескриптор файла.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.