На онлайн-форумах часто задают такой вопрос: «Как я могу в своей программе отыскать имя файла, связанное с файловым дескриптором X?» Краткий ответ: никак (по меньшей мере нельзя добиться портируемости и однозначности), поскольку дескриптор соотносится с индексным, а ему может соответствовать несколько имен файлов (или даже ни одного, как сказано в разделе 18.3).

В Linux можно увидеть, какие файлы открыты процессом в настоящее время, с помощью команды readdir() (раздел 18.8), сканирующей содержимое характерного для Linux каталога /proc/PID/fd, содержащего символические ссылки для каждого файлового дескриптора, открытого процессом в данный момент. Для этой цели можно применять также инструменты lsof(1) и fuser(1), которые были портированы во многие UNIX-системы.

У жестких ссылок есть два ограничения, которые можно обойти за счет использования символических ссылок:

• поскольку записи каталога (жесткие ссылки) соотносятся с файлами только с помощью номера индексного дескриптора, а такие номера являются уникальными лишь в пределах одной файловой системы, жесткая ссылка должна находиться в той же файловой системе, что и файл, на который она указывает;

• невозможно создать жесткую ссылку на каталог. Это предотвращает создание циклических ссылок, которые создавали бы помехи в работе многих системных программ.

В ранних реализациях UNIX суперпользователю разрешалось создавать жесткие ссылки на каталоги. Это было необходимо, поскольку в тех версиях ОС не было системного вызова mkdir(). Вместо него применяли системный вызов mknod(), а затем создавали ссылки для записей. и… ([Vahalia, 1996]). И хотя данная особенность уже не нужна, в некоторых современных реализациях UNIX она сохранена для обратной совместимости.

Результат, подобный жестким ссылкам на каталоги, можно получить с помощью связанного монтирования (см. подраздел 14.9.4).

18.2. Символические (мягкие) ссылки

Символическая ссылка, иногда называемая мягкой ссылкой, является специальным типом файла, данные которого — это имя другого файла. На рис. 18.2 проиллюстрирована ситуация, в которой две жесткие ссылки, /home/erena/this и /home/allyn/that, ссылаются на один файл, а символическая ссылка /home/kiran/other соотносится с именем /home/erena/this.

Рис. 18.2. Представление жестких и символических ссылок

В сеансе оболочки символические ссылки создаются с помощью команды ln — s. Команда ls — F отображает завершающий символ @ в конце символических ссылок.

Имя пути, с которым соотносится символическая ссылка, может быть либо абсолютным, либо относительным. Относительная символическая ссылка интерпретируется по отношению к местоположению самой ссылки.

Символические ссылки не обладают таким же статусом, что и жесткие ссылки. В частности, символическая ссылка не учитывается в счетчике ссылок для файла, на который указывает. (Таким образом, счетчик ссылок индексного дескриптора 61 на рис. 18.2 равен 2, а не 3.) Следовательно, если удалить имя файла, с которым соотносится символическая ссылка, то сама она останется, несмотря на то что ее нельзя будет разыменовать (проследовать по ней). О такой ссылке говорят, что она стала зависшей. Можно даже создать символическую ссылку на имя файла, который не существует на момент ее создания.

Символические ссылки появились в стандарте 4.2BSD. И хотя они не были включены в стандарт POSIX.1-1990, впоследствии были приняты в стандарт SUSv1, а затем и в SUSv3.

Поскольку символическая ссылка соотносится с именем файла, а не с номером индексного дескриптора, ее можно использовать для указания на файл в иной файловой системе. Символические ссылки избавлены также от другого ограничения, характерного для жестких: можно создавать символические ссылки на каталоги. Такие инструменты, как find и tar, помогут различить жесткие и символические ссылки, а также либо по умолчанию не будут следовать по символическим, либо позволят избежать попадания в циклические ссылки, созданные с применением символических.

Можно создать цепочку символических ссылок (то есть a является символической ссылкой на b, которая является символической ссылкой на c). Когда такая ссылка указана в различных системных вызовах, работающих с файлами, ядро разыменовывает цепочки ссылок, чтобы добраться до окончательного файла.

Перейти на страницу:

Похожие книги