Основы операционной системы UNIX

       

Связь


Каталог содержит имена файлов и указатели на их метаданные. Такая архитектура позволяет одному файлу иметь несколько имен в файловой системе. Имена жестко связаны с метаданными и, соответственно, с данными файла, в то время как сам файл существует независимо от того, как его называют в файловой системе.

Стандарт POSIX (Portable Operating System Interface) требует реализовать поддержку двух типов связей - жестких и символических. Жесткой связью (hard link) считается элемент каталога, указывающий непосредственно на некоторый индексный дескриптор. Жесткие связи очень эффективны, но у них существуют определенные ограничения, так как они могут создаваться только в пределах одной физической файловой системы. Когда создается такая связь, связываемый файл должен уже существовать. Кроме того, каталоги не могут связываться жесткой связью.

Символическая связь (symbolic link) - это специальный файл, который содержит путь к другому файлу. Указание на то, что данный элемент каталога является символической связью, находится в индексном дескрипторе. Поэтому обычные команды доступа к файлу вместо получения данных из физического файла, берут их из файла, имя которого приведено в связи. Этот путь может указывать на что угодно: это может быть каталог, он может даже находиться в другой физической файловой системе, более того, указанного файла может и вовсе не быть.

Некоторые системы накладывают ограничение на количество символических связей в пути. POSIX требует, чтобы их поддерживалось не менее 20, но действительное значение зависит от конкретной реализации. Конечно, в описании пути можно использовать сочетание символических и жестких связей.

Количество жестких связей файла (а также количество файлов в каталоге, если файл является каталогом) отображается во втором поле длинного листинга:

[kravchuk@arturo 15:27:22 /tmp]$ ls >f2.txt [kravchuk@arturo 15:37:22 /tmp]$ ln f3.txt f2.txt ln: cannot access f3.txt [kravchuk@arturo 15:37:31 /tmp]$ ln f2.txt f3.txt [kravchuk@arturo 15:37:59 /tmp]$ ls -l f?.txt -rw-r--r-- 1 kravchuk 50 0 Мар 26 14:40 f1.txt -rw-r--r-- 2 kravchuk 50 643 Мар 26 15:37 f2.txt -rw-r--r-- 2 kravchuk 50 643 Мар 26 15:37 f3.txt [kravchuk@arturo 15:38:05 /tmp]$




В этом примере мы создали текстовый файл с листингом текущего каталога, а затем создали на него жесткую связь. Для этого используется команда ln со следующим синтаксисом:

ln [ -fns ] исходный_файл [ цель ]

ln [ -fns ] исходный_файл ... цель

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

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

Опции -f и -n требуют, соответственно, принудительно создать связь или не создавать ее, если цель задает существующий файл.

Обратите внимание, что первый аргумент команды ln должен указывать существующий файл или каталог.

В длинном листинге признаком символической связи является символ l в первой позиции первого столбца. Рассмотрим простой пример создания символической связи:

[kravchuk@arturo 15:57:41 /tmp]$ ln -s f2 f4 [kravchuk@arturo 15:57:50 /tmp]$ ls -l f* -rw-r--r-- 1 kravchuk 50 0 Мар 26 14:40 f1.txt -rw-r--r-- 2 kravchuk 50 643 Мар 26 15:37 f2.txt -rw-r--r-- 2 kravchuk 50 643 Мар 26 15:37 f3.txt lrwxrwxrwx 1 kravchuk 50 2 Мар 26 15:57 f4 -> f2


Содержание раздела