Мир на трёх кашалотах мается
2. Файлы

Глава из книги Сага о FreeBSD

Алексей Федорчук

2008-11-19

назад | к началу | вперед

Каналы и сокеты

Специальные виды файлов — именованные каналы (named pipe) и сокеты (socket), — предназначены для обмена данными между процессами. Они важны для разработчиков ПО, пользователь с ними, как правило, напрямую не общается. Однако знать о факте их существования не вредно.

Обычные файлы

Наконец-то мы подобрались к типу, наиболее важному для пользователей — обычным, или регулярным, файлам. Рассмотрение их я отложил напоследок по одной причине — дать определение обычного файла можно только методом исключения. А именно, к типу обычных файлов отнесено все, что не является каталогами, символическими ссылками, файлами устройств, каналами и сокетами.

Легко понять, что множество обычных файлов охватывает все то, что в DOS/Windows рассматривалось бы как самостоятельные типы — исполняемые бинарные файлы, файлы сценариев оболочки, обычные тексты, файлы изображений, файлы в форматах специальных программ (например, документы текстовых процессоров или электронных таблиц). Общее между ними одно: содержимое всех их можно увидеть с помощью либо стандартных команд просмотра файлов, либо программам, в которых они были созданы. Непосредственный же просмотр содержимого файлов прочих типов, как правило, невозможен — доступ к ним можно получить только косвенными путями.

Еще раз об именах

Как можно заключить из изложенного выше, имя файла не несет во FreeBSD того сакрального смысла, который вкладывался в него со времен DOS. Не имеется здесь и расширений имен (типа приснопамятной DOS-маски 8.3), предопределяющих отношение ОС к данным из конкретного файла.

На самом деле во FreeBSD на длину и формат имени файла накладывается весьма мало ограничений. Лимит на длину имени определяется форматом каталога, принятым в её файловой системе, и составляет 255 символов.

В именах файлов абсолютно запрещенными к использованию символами, с точки зрения ОС, являются лишь прямой слэш (/), зарезервированный как имя собственное корневого каталога и элемент пути к файлу (разделитель каталогов), и NULL, то есть отсутствие всякого символа. Все прочие символы алфавитные, цифровые и специальные символы теоретически могут входить в имена.

Важно помнить, что имена файлов во FreeBSD чувствительны к регистру образующих их алфавитных символов. То есть README и readme всегда будут восприниматься как имена разных файлов.

Однако практически на имена файлов накладывают свои ограничения еще и некоторые прикладные программы. В первую очередь это — командные оболочки, которые целый ряд символов, не принадлежащих к числу алфавитно-цифровых, интерпретируют по-своему — как коды управления, регулярные выражения и так далее. В главе о командах будет показано, что в принципе специальное значение символов можно отменить. Тем не менее, такие знаки, как *, !, #, @ и прочие из верхнего ряда клавиатуры, за исключением подчеркивания (_), не рекомендуется включать в имена файлов. К слову, сам символ отмены специального значения — обратный слэш (\), — также в именах лучше не использовать...

Зато точек имя файла во FreeBSD может содержать сколько угодно — ведь мистического значения (отделения собственно имени от расширения) в этот символ не вкладывается. И потому здесь обычными являются имена типа archive.tar.gz или archive.tar.bz2 — файлы архивов, образованных утилитой tar и компрессированных программами gzip или bzip2, соответственно.

Особую роль играет точка в начале имени файла — например, .tcshrc. Файлы такого вида так и называются — dot-файлами. Имена их недоступны при просмотре содержимого каталогов без специальных средств. Обычно в качестве dot-файлов выступают конфигурационные файлы пользователей.

Поскольку одноименные файлы (с разным или одинаковым содержанием) вполне могут существовать в разных каталогах, имя файла само по себе не позволяет однозначно идентифицировать его положение в файловой системе. Отсюда возникает понятие пути к имени, по-английски — pathname, что иногда переводится как полное, или составное, имя. Оно, помимо собственно именования файла, указывает всю цепочку подкаталогов, отделяющих его либо от корневого каталога (абсолютный путь к имени), либо от каталога текущего (относительный путь).

Абсолютный путь отсчитывается от "главного" корневого каталога файловой системы вообще и имеет следующий вид:

/dirname/filename

где dir1 — подкаталог корневого каталога (первый /). Относительный путь отсчитывается от каталога, выступающего текущим для данного процесса. В предположении, что текущим является каталог /dir1, относительный путь к файлу /dir2/filename будет выглядеть так:

../dirname/filename

Элементы пути к имени (промежуточные подкаталоги) в любом случае разделяются символами прямого слэша — именно поэтому он и является абсолютно запрещенным к употреблению собственно в именах.

На полную длину пути также накладываются системные ограничения. Впрочем, они весьма мягкие — лимит pathname составляет 4096 символов. Так что путь к имени файла может быть сколь угодно длинным — в разумных пределах, разумеется.

Вспомним о символических ссылках — именно путь к именам файлов любого другого типа и составляет содержимое файлов этого типа. Подобно путям, ссылки могут быть абсолютными, определенными от корневого каталога, и относительными, задаваемыми от текущего каталога. Абсолютная всегда однозначно определяет файл, на который она ссылается. Ссылка же относительная зависит от того, какой каталог выступал в качестве текущего в момент её создания. И при перемещении относительной ссылки в иной каталог она станет неработоспособной.

И еще о текущем каталоге. Для пользователя, заставшего времен DOS, представляется очевидным, что любой файл (например, исполняемый) ищется в первую очередь в текущем каталоге. Во FreeBSD, в зависимости от настроек, поиск в текущем каталоге или не производится вообще, или осуществляется в последнюю очередь. И потому, если требуется вызвать исполняемый файл из текущего каталога, его положение должно быть указано в явном виде:

% ./filename

Это имеет глубокое внутреннее обоснование — в том числе и с точки зрения безопасности, и к этому вопросу мы еще будем возвращаться.

назад | к началу | вперед