Все четверо /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)
. Названные файлы - это способ косвенно заставить процесс использовать один из его уже открытых файлов, а не открывать новый файл; они в основном полезны для передачи в командной строке программы, где программа ожидает имя файла, который нужно открыть.