Мне было интересно, какие различия и отношения между дескрипторами файлов и именами файлов. Все ли они используются для доступа к файлам? Если да, то же самое?
Так , например, /dev/fd/0
, /dev/stdin
и /proc/self/fd/0
все ссылки на /dev/pts/2
. Это четыре дескриптора файла или имена файла?
Ответы:
Все четверо
/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)
. Названные файлы - это способ косвенно заставить процесс использовать один из его уже открытых файлов, а не открывать новый файл; они в основном полезны для передачи в командной строке программы, где программа ожидает имя файла, который нужно открыть.источник
Filename - это просто имя файла в файловой системе, ничего более - это просто строка.
Файловый дескриптор - это какой-то объект, откуда вы можете читать и / или писать. Это открытый и готовый файл. Существуют не только файловые дескрипторы - stdin, stdout и stderr также являются дескрипторами, вы можете писать и читать из них, используя абсолютно те же функции, что и с файлами (за исключением того, что вы не можете, например, искать). Другие примеры дескрипторов, которые не являются файлами: именованные каналы и сетевые сокеты.
В коде файловый дескриптор - это переменная, указатель на что-то в ядре, представляющий объект файла.
Это все псевдофайлы, которые могут быть полезны для некоторых скриптов или программ. Вы можете открыть их и открыть () вернет вам дескриптор файла.
источник