Для организации всех файлов в системе ядро поддерживает структуру одного иерархического каталога. (В отличие от таких операционных систем, как Microsoft Windows, где своя собственная иерархия каталогов имеется у каждого дискового устройства.) Основу этой иерархии составляет корневой каталог по имени / (слеш). Все файлы и каталоги являются дочерними или более отдаленными потомками корневого каталога. Пример такой иерархической файловой структуры показан на рис. 2.1.
Рис. 2.1. Пример иерархии одного каталога Linux
Типы файлов
Внутри файловой системы каждый файл имеет метку, указывающую, к какому типу файлов он относится. Один из этих типов файлов обозначает стандартные файлы данных, которые чаще всего называют обычными или простыми файлами, чтобы отличить их от файлов других типов. Другие типы файлов включают в себя устройства, конвейеры, сокеты, каталоги и символьные ссылки.
Термин «файл» обычно используется для обозначения файла любого типа, а не только обычного файла.
Каталоги и ссылки
Каталог — это особый файл, чье содержимое принимает форму таблицы из имен файлов в совокупности с указателями на соответствующие файлы. Эта связка из имени файла и указателя на него называется ссылкой, и у файлов в одном и том же или в разных каталогах может быть несколько ссылок, а следовательно, и несколько имен.
Каталоги могут содержать ссылки как на файлы, так и на другие каталоги. С помощью ссылок между каталогами устанавливается иерархия каталогов, показанная на рис. 2.1.
Каждый каталог содержит как минимум две записи:. (точка), которая представляет собой ссылку на сам каталог, и… (точка-точка), которая является ссылкой на его родительский каталог — тот каталог, что расположен над ним в иерархии. Каждый каталог, за исключением корневого, имеет свой родительский каталог. Для корневого каталога запись… является ссылкой на него самого (таким образом, обозначение /.. — то же самое, что и /).
Символьные ссылки
Подобно обычной ссылке, символьная ссылка предоставляет альтернативное имя для файла. Но, в отличие от обычной ссылки, представляющей собой в списке каталога запись вида «имя файла плюс указатель», символьная ссылка — это специально помеченный файл, содержащий имя другого файла. (Иными словами, у символьной ссылки в каталоге есть запись вида «имя файла плюс указатель», и файл, на который ссылается указатель, содержит строку с именем другого файла.) Этот последний файл часто называют целью символьной ссылки, и зачастую говорится, что символьная ссылка «указывает» или «ссылается» на целевой файл. Когда в системном вызове указывается путевое имя, в большинстве случаев ядро автоматически снимает косвенность каждой символьной ссылки в путевом имени (также говорят «следует по ним»), заменяя ее именем того файла, на который она ведет. Этот процесс может происходить рекурсивно, если цель символьной ссылки сама по себе является символьной ссылкой. (Ядро накладывает ограничение на количество ссылок, чтобы предотвратить возможность появления замкнутых цепочек символьных ссылок.) Если символьная ссылка указывает на несуществующий файл, то говорится, что это битая ссылка.
В качестве альтернативных названий для обычной и символьной ссылки зачастую используются выражения «жесткая ссылка» и «мягкая ссылка». Смысл наличия двух разных типов ссылок объясняется в главе 18.
Имена файлов
В большинстве файловых систем Linux длина имен файлов может составлять до 255 символов. Имена файлов могут содержать любые символы, за исключением слешей (/) и символа с нулевым кодом (\0). Но желательно использовать только буквы и цифры, а также символы точки (.), подчеркивания (_) и дефиса (-). Этот 65-символьный набор, [-._a-zA-Z0-9], в SUSv3 называется портируемым набором символов для имен файлов.
Следует избегать использования в именах файлов символов, не входящих в портируемый набор, поскольку эти символы могут иметь специальное значение в оболочке, внутри регулярных выражений или в других контекстах. Если имя файла с символами, имеющими специальное значение, появляется в таких контекстах, эти символы должны быть экранированы, то есть специально помечены. Для этого обычно перед ними добавляют обратный слеш (\), который показывает, что они не должны быть интерпретированы в их специальном значении. В контекстах, где механизм экранирования недоступен, такое имя файла применять нельзя.
Кроме того, следует избегать ситуаций, когда в связке команда имя_файла имя файла начинается с —, так как оно может быть ошибочно принято за ключ команды.
Путевые имена